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

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

  • Имя столбца начинается с знака (@).

  • Имя столбца не начинается с знака (@).

  • Имя столбца не начинается с sign@ и содержит знак косой черты (/).

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

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

Имя столбца начинается с знака at (@)

Если имя столбца начинается с знака (@) и не содержит знак косой черты (/), создается атрибут <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  

Имя столбца не начинается с знака at (@)

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

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

SELECT 2+2 as result  
for xml PATH  

Результат:

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

Следующий запрос задает имя столбца ManuWorkCenterInformation для XML, возвращаемого XQuery из столбца «Инструкции» типа 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>  

Имя столбца не начинается с знака at (@) и содержит знак косой черты (/)

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

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

По умолчанию среднее имя сотрудника равно NULL, и значение 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 и LastName, как указано в предыдущем запросе, добавив столбцы адресов между столбцами FirstName и MiddleName.

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