Столбцы с именем
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
Ниже приведены условия, при которых столбцы наборов строк с соответствующим именем сопоставляются с итоговым XML-документом с учетом регистра:
имя столбца начинается с символа
@
;Имя столбца не начинается с знака (
@
).Имя столбца не начинается с знака (
@
) и содержит знак косой черты (/
).несколько столбцов имеют одинаковый префикс;
один из столбцов имеет другое имя.
Имя столбца начинается с знака (@
)
Если имя столбца начинается с знака (@
) и не содержит знак косой черты (/
), создается атрибут row
элемента с соответствующим значением столбца. Например, следующий запрос возвращает набор строк с двумя столбцами (@PmId, Name
). В результирующем XML PmId
атрибут добавляется в соответствующий row
элемент, а для него назначается значение ProductModelID
.
SELECT ProductModelID as "@PmId",
Name
FROM Production.ProductModel
WHERE ProductModelID = 7
FOR XML PATH;
Результат:
<row PmId="7">
<Name>HL Touring Frame</Name>
</row>
Атрибуты должны поступать до любых других типов узлов, таких как узлы элементов и текстовые узлы, на том же уровне. Следующий запрос возвращает ошибку:
SELECT Name,
ProductModelID as "@PmId"
FROM Production.ProductModel
WHERE ProductModelID = 7
FOR XML PATH;
Имя столбца не начинается с знака (@
)
Если имя столбца не начинается с знака (@
), не является одним из тестов узла XPath и не содержит знак косой черты (/
), xml-элемент, который является подэлементом элемента строки, row
по умолчанию создается.
В результате следующего запроса указывается имя столбца. Дочерний элемент result
добавляется к элементу row
.
SELECT 2 + 2 as result
for xml PATH;
Результат:
<row>
<result>4</result>
</row>
Следующий запрос задает имя столбца для XML, ManuWorkCenterInformation
возвращаемого XQuery для Instructions
столбца типа XML . Элемент ManuWorkCenterInformation
добавляется в качестве дочернего к элементу row
.
SELECT
ProductModelID,
Name,
Instructions.query(
'declare namespace MI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/MI:root/MI:Location
') as ManuWorkCenterInformation
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH;
Результат:
<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
, содержащего First
Middle
имя и Last
имя.
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, укажите директиву 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>