Partilhar via


Colunas com nome

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Seguem-se as condições específicas em que as colunas de conjunto de linhas com um nome são mapeadas, com sensibilidade a maiúsculas minúsculas, para o XML resultante:

  • O nome da coluna começa com um sinal at (@).

  • O nome da coluna não começa com o sinal at (@).

  • O nome da coluna não começa com um sinal at (@) e contém uma barra (/).

  • Várias colunas partilham o mesmo prefixo.

  • Uma coluna tem um nome diferente.

O nome da coluna começa com um sinal at (@)

Se o nome da coluna começar com um sinal at (@) e não contiver uma marca de barra (/), é criado um atributo do row elemento que tem o valor correspondente da colunha. Por exemplo, a consulta seguinte devolve um conjunto de linhas de duas colunas (@PmId, Name). No XML resultante, um PmId atributo é adicionado ao elemento correspondente row e um valor de ProductModelID é atribuído a ele.

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

Este é o resultado:

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

Os atributos devem preceder quaisquer outros tipos de nós, como nós de elemento e nós de texto, no mesmo nível. A consulta seguinte devolverá um erro:

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

O nome da coluna não começa com o sinal de at (@)

Se o nome da coluna não começar com um sinal at (@), não for um dos testes de nó XPath, e não contiver uma barra (/), um elemento XML que é um subelemento do elemento de linha será criado por padrão row.

A consulta seguinte especifica o nome da coluna, o resultado. Portanto, um result elemento filho é adicionado ao row elemento.

SELECT 2 + 2 as result
for xml PATH;

Este é o resultado:

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

A consulta seguinte especifica o nome da coluna, ManuWorkCenterInformation, para o XML devolvido pelo XQuery especificado para a coluna de tipo Instructions. Portanto, um ManuWorkCenterInformation elemento é adicionado como filho do row elemento.

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;

Este é o resultado:

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

O nome da coluna não começa com o sinal at (@) e contém uma barra (/)

Se o nome da coluna não começar com um sinal at (@), mas contiver uma marca de barra (/), o nome da coluna indica uma hierarquia XML. Por exemplo, se o nome da coluna for "Nome1/Nome2/Nome3.../Nomen", cada Nomei representa um nome de elemento que está aninhado no elemento da linha atual (para i = 1) ou que está sob o elemento que tem o nomeNome i-1. Se o Nomen começar por @, é mapeado para um atributo do elemento Nomen-1 .

Por exemplo, a consulta seguinte devolve um ID de funcionário e um nome que são representados como um elemento EmpName complexo que contém um First, Middle, e Last nome.

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;

Os nomes das colunas são usados como caminho na construção de XML no modo PATH. O nome da coluna que contém os valores do ID do funcionário começa por '@'. Portanto, um atributo, EmpID, é adicionado ao row elemento. Todas as outras colunas incluem uma barra (/) no nome da coluna que indica hierarquia. O XML resultante terá o elemento filho EmpName sob o elemento row, e o elemento filho EmpName terá os elementos filhos First, Middle e Last.

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

O nome do meio do funcionário é nulo e, por padrão, o valor nulo corresponde à ausência do elemento ou atributo. Se quiser elementos gerados para os valores NULL, pode especificar a diretiva ELEMENTS com XSINIL, como mostrado nesta consulta.

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;

Este é o resultado:

<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>

Por defeito, o modo PATH gera XML centrado no elemento. Portanto, especificar a diretiva ELEMENTS numa consulta em modo PATH não tem efeito. No entanto, como mostrado no exemplo anterior, a diretiva ELEMENTS é útil com o XSINIL para gerar elementos para valores nulos.

Além do ID e do nome, a consulta seguinte recupera a morada de um funcionário. De acordo com o caminho nos nomes das colunas para endereços, um elemento filho Address é adicionado ao elemento row e os detalhes do endereço são adicionados como elementos filhos do elemento 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;

Este é o resultado:

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

Várias colunas partilham o mesmo prefixo path

Se várias colunas subsequentes partilharem o mesmo prefixo de caminho, são agrupadas sob o mesmo nome. Se prefixos de espaço de nomes diferentes estiverem a ser usados mesmo que estejam ligados ao mesmo espaço de nomes, um caminho é considerado diferente. Na consulta anterior, as colunas FirstName, MiddleName e LastName partilham o mesmo prefixo EmpName. Por isso, são adicionados como filhos do EmpName elemento. Isto também acontece quando estava a criar o Address elemento no exemplo anterior.

Uma coluna tem um nome diferente

Se aparecer uma coluna com um nome diferente no meio, irá quebrar o agrupamento, como mostrado na consulta modificada seguinte. A consulta quebra o agrupamento de FirstName, MiddleName e LastName, conforme especificado na consulta anterior, adicionando colunas de endereço entre as colunas FirstName e 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;

Como resultado, a consulta cria dois EmpName elementos. O primeiro elemento EmpName tem o elemento filho FirstName, e o segundo elemento EmpName tem os elementos filhos MiddleName e LastName.

Este é o resultado:

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

Consulte também