Поделиться через


Столбцы с именем

Ниже приведены условия, при которых столбцы наборов строк с соответствующим именем сопоставляются с итоговым XML-документом с учетом регистра:

  • имя столбца начинается с символа @;

  • имя столбца не начинается с символа @;

  • имя столбца не начинается с символа @ и содержит косую черту (/);

  • несколько столбцов имеют одинаковый префикс;

  • один из столбцов имеет другое имя.

Имя столбца начинается с символа @

Если имя столбца начинается со знака @и не содержит косую черту (/), создается атрибут <row> элемента с соответствующим значением столбца. Например, следующий запрос возвращает набор строк с двумя столбцами (@PmId, Name). В полученном XML-коде атрибут PmId добавляется к соответствующему <row> элементу и ему присваивается значение ProductModelID.

  
SELECT ProductModelID as "@PmId",  
       Name  
FROM Production.ProductModel  
WHERE ProductModelID=7  
FOR XML PATH   
go  
  

Результат:

<row PmId="7">  
  <Name>HL Touring Frame</Name>  
</row>  

Обратите внимание, что на одном уровне атрибуты должны располагаться перед любыми другими типами узлов, например, перед узлами элементов и текстовыми узлами. Следующий запрос возвращает ошибку:

SELECT Name,  
       ProductModelID as "@PmId"  
FROM Production.ProductModel  
WHERE ProductModelID=7  
FOR XML PATH   
go  

Имя столбца не начинается с символа @

Если имя столбца не начинается со знака @, не является одним из тестов узла XPath и не содержит знак косой черты (/), по умолчанию создается XML-элемент, <row> который является вложенным элементом элемента строки.

В результате следующего запроса указывается имя столбца. Таким образом, дочерний <result> элемент добавляется к элементу .<row>

SELECT 2+2 as result  
for xml PATH  

Результат:

<row>  
  <result>4</result>  
</row>  

Следующий запрос указывает имя столбца ManuWorkCenterInformation для XML-данных, возвращенных запросом XQuery, указанным по отношению к столбцу Instructions типа xml . Таким образом <ManuWorkCenterInformation> , элемент добавляется как дочерний элемент <row> элемента .

SELECT   
       ProductModelID,  
       Name,  
       Instructions.query('declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
                /MI:root/MI:Location   
              ') as ManuWorkCenterInformation  
FROM Production.ProductModel  
WHERE ProductModelID=7  
FOR XML PATH   
go  

Результат:

<row>  
  <ProductModelID>7</ProductModelID>  
  <Name>HL Touring Frame</Name>  
  <ManuWorkCenterInformation>  
    <MI:Location ...LocationID="10" ...></MI:Location>  
    <MI:Location ...LocationID="20" ...></MI:Location>  
     ...  
  </ManuWorkCenterInformation>  
</row>  

Имя столбца не начинается с символа @ и содержит косую черту (/)

Если имя столбца не начинается с символа @, но содержит косую черту (/), оно является признаком иерархии XML. Например, если имя столбца — "Name1/Name2/Name3.../Namen ", каждое имяi представляет имя элемента, вложенное в текущий элемент строки (для i=1) или в элементе с именемi-1. Если Имяn начинается с @, оно сопоставляется с атрибутом элемента Namen-1 .

Например, следующий запрос возвращает идентификатор работника и имя, представленное сложным элементом EmpName, который включает в себя имя, отчество и фамилию работника.

SELECT EmployeeID "@EmpID",   
       FirstName  "EmpName/First",   
       MiddleName "EmpName/Middle",   
       LastName   "EmpName/Last"  
FROM   HumanResources.Employee E, Person.Contact C  
WHERE  E.EmployeeID = C.ContactID  
AND    E.EmployeeID=1  
FOR XML PATH  

Имена столбцов используются в качестве пути при построении XML-документа в режиме PATH. Имя столбца, содержащего значения идентификатора сотрудника, начинается с "@". Таким образом, в элемент добавляется <row> атрибут EmpID. Имена всех других столбцов содержат символ косой черты (/), являющийся признаком иерархии. Результирующий XML-код будет содержать дочерний <>EmpNameэлемент под элементомrow<> , а дочерний <EmpName> элемент будет иметьFirst<> дочерние элементы ,Middle><и .<Last>

<row EmpID="1">  
  <EmpName>  
    <First>Gustavo</First>  
    <Last>Achong</Last>  
  </EmpName>  
</row>  

Отчество работника имеет значение NULL, которое по умолчанию сопоставляется с отсутствием элемента или атрибута. Если необходимо сформировать элементы для значений NULL, укажите директиву ELEMENTS с ключевым словом XSINIL, как показано в данном запросе.

SELECT EmployeeID "@EmpID",   
       FirstName  "EmpName/First",   
       MiddleName "EmpName/Middle",   
       LastName   "EmpName/Last"  
FROM   HumanResources.Employee E, Person.Contact C  
WHERE  E.EmployeeID = C.ContactID  
AND    E.EmployeeID=1  
FOR XML PATH, ELEMENTS XSINIL  

Результат:

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
      EmpID="1">  
  <EmpName>  
    <First>Gustavo</First>  
    <Middle xsi:nil="true" />  
    <Last>Achong</Last>  
  </EmpName>  
</row>  

По умолчанию в режиме PATH формируется элементно-ориентированный XML-документ. Поэтому указание директивы ELEMENTS в режиме PATH не имеет никакого смысла. Однако как показано в предыдущем примере, директива ELEMENTS с ключевым словом XSINIL может быть полезна при формировании элементов для значений NULL.

Следующий запрос кроме идентификатора и имени возвращает еще и адрес работника. Согласно пути в именах столбцов адресов, дочерний <Address> элемент добавляется к элементу <row> , а сведения об адресе добавляются в качестве дочерних <Address> элементов элемента.

SELECT EmployeeID   "@EmpID",   
       FirstName    "EmpName/First",   
       MiddleName   "EmpName/Middle",   
       LastName     "EmpName/Last",  
       AddressLine1 "Address/AddrLine1",  
       AddressLine2 "Address/AddrLIne2",  
       City         "Address/City"  
FROM   HumanResources.Employee E, Person.Contact C, Person.Address A  
WHERE  E.EmployeeID = C.ContactID  
AND    E.AddressID = A.AddressID  
AND    E.EmployeeID=1  
FOR XML PATH  

Результат:

<row EmpID="1">  
  <EmpName>  
    <First>Gustavo</First>  
    <Last>Achong</Last>  
  </EmpName>  
  <Address>  
    <AddrLine1>7726 Driftwood Drive</AddrLine1>  
    <City>Monroe</City>  
  </Address>  
</row>  

Несколько столбцов имеют одинаковый префикс пути

Если несколько последовательных столбцов имеют одинаковый префикс пути, производится их группировка под одним именем. Если используется одно и то же пространство имен, но разные префиксы пространства имен, путь считается отличающимся. В предыдущем запросе столбцы FirstName, MiddleName и LastName используют один и тот же префикс EmpName. Поэтому они добавляются в качестве дочерних элементов <EmpName> элемента . Это также относится к созданию <Address> элемента в предыдущем примере.

Один из столбцов имеет другое имя

Если между столбцами встречается столбец с другим именем, группирование будет нарушено, как это показано в следующем измененном запросе. Добавляя столбцы с адресом между столбцами FirstName и MiddleName, данный запрос нарушает группирование столбцов FirstName, MiddleName и LastName, указанное в предыдущем запросе.

SELECT EmployeeID "@EmpID",   
       FirstName "EmpName/First",   
       AddressLine1 "Address/AddrLine1",  
       AddressLine2 "Address/AddrLIne2",  
       City "Address/City",  
       MiddleName "EmpName/Middle",   
       LastName "EmpName/Last"  
FROM   HumanResources.EmployeeAddress E, Person.Contact C, Person.Address A  
WHERE  E.EmployeeID = C.ContactID  
AND    E.AddressID = A.AddressID  
AND    E.EmployeeID=1  
FOR XML PATH  

В результате запрос создает два <EmpName> элемента. Первый <>EmpNameэлемент имеет дочерний <>FirstNameэлемент, а второй <>EmpNameэлемент имеет дочерние <>MiddleNameэлементы и .<LastName>

Результат:

<row EmpID="1">  
  <EmpName>  
    <First>Gustavo</First>  
  </EmpName>  
  <Address>  
    <AddrLine1>7726 Driftwood Drive</AddrLine1>  
    <City>Monroe</City>  
  </Address>  
  <EmpName>  
    <Last>Achong</Last>  
  </EmpName>  
</row>  

См. также:

Использование режима PATH совместно с FOR XML