Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Ниже приведены условия, при которых столбцы наборов строк с соответствующим именем сопоставляются с итоговым 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>