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


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

Применяется к:SQL ServerAzure SQL DatabaseAzure, управляемому экземпляру 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, содержащего FirstMiddleимя и 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>

Несколько столбцов используют один и тот же префикс пути

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

См. также