Partilhar via


Exemplo: Recuperar informações de funcionários

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

Este exemplo recupera um ID de funcionário e um nome de funcionário para cada funcionário. AdventureWorks2025 No banco de dados, o employeeID pode ser obtido na coluna BusinessEntityID na tabela Employee. Os nomes dos funcionários podem ser obtidos na tabela Pessoa. A coluna BusinessEntityID pode ser usada para unir as tabelas.

Suponha que pretenda que a transformação FOR XML EXPLICIT gere XML conforme mostrado no exemplo a seguir.

<Employee EmpID="1" >
  <Name FName="Ken" LName="Sánchez" />
</Employee>
...

Como há dois níveis na hierarquia, você escreveria duas SELECT consultas e aplicaria UNION ALL. Esta é a primeira consulta que recupera valores para o <Employee> elemento e seus atributos. A consulta atribui 1 como Tag valor para o <Employee> elemento e NULL como Parent, porque é o elemento de nível superior.

SELECT 1    as Tag,
       NULL as Parent,
       E.BusinessEntityID AS [Employee!1!EmpID],
       NULL       as [Name!2!FName],
       NULL       as [Name!2!LName]
FROM   HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON  E.BusinessEntityID = P.BusinessEntityID;

Esta é a segunda consulta. Ele recupera valores para o <Name> elemento . Ele atribui 2 como valor de Tag para o elemento <Name> e 1 como valor de tag Parent, identificando <Employee> como o pai.

SELECT 2 as Tag,
       1 as Parent,
       E.BusinessEntityID,
       FirstName,
       LastName
FROM   HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON  E.BusinessEntityID = P.BusinessEntityID;

Você combina essas consultas com UNION ALL, aplica FOR XML EXPLICIT e especifica a cláusula necessária ORDER BY. Você deve classificar o conjunto de linhas primeiro por BusinessEntityID e depois por nome para que os valores NULL no nome apareçam primeiro. Ao executar a consulta a seguir sem a cláusula FOR XML, você pode ver a tabela universal gerada.

Esta é a consulta final:

SELECT 1    as Tag,
       NULL as Parent,
       E.BusinessEntityID as [Employee!1!EmpID],
       NULL       as [Name!2!FName],
       NULL       as [Name!2!LName]
FROM   HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON  E.BusinessEntityID = P.BusinessEntityID
UNION ALL
SELECT 2 as Tag,
       1 as Parent,
       E.BusinessEntityID,
       FirstName,
       LastName
FROM   HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON  E.BusinessEntityID = P.BusinessEntityID
ORDER BY [Employee!1!EmpID],[Name!2!FName]
FOR XML EXPLICIT;

Este é o resultado parcial:

<Employee EmpID="1">
  <Name FName="Ken" LName="Sánchez" />
</Employee>
<Employee EmpID="2">
  <Name FName="Terri" LName="Duffy" />
</Employee>
...

O primeiro SELECT especifica nomes para colunas no conjunto de linhas resultante. Esses nomes formam dois grupos de colunas. O grupo que tem Tag valor 1 no nome da coluna identifica-se Employee como um elemento e EmpID como o atributo. O outro grupo de colunas tem Tag valor 2 na coluna e identifica <Name> como o elemento e FNameLName como os atributos.

A tabela a seguir mostra o conjunto de linhas parciais gerado pela consulta:

Etiqueta Progenitor Funcionário!1!EmpID Nome!2! FName Nome!2! Sobrenome
1 NULO 1 NULO NULO
2 1 1 Edgar Sánchez
1 NULO 2 NULO NULO
2 1 2 Terri Duffy
1 NULO 3 NULO NULO
2 1 3 Roberto. Tamburello
... ... ... ... ...

É assim que as linhas na tabela universal são processadas para produzir a árvore XML resultante:

A primeira linha identifica o Tag valor 1. Portanto, o grupo de colunas que tem o Tag valor 1 é identificado, Employee!1!EmpID. Esta coluna identifica Employee como o nome do elemento. Em seguida, é criado um <Employee> elemento com EmpID atributos. Os valores de coluna correspondentes são atribuídos a esses atributos.

A segunda linha tem o Tag valor 2. Portanto, o grupo de colunas que tem o Tag valor 2 no nome da coluna, Name!2!FName, Name!2!LName, é identificado. Esses nomes de coluna identificam Name como nome do elemento. É criado um <Name> elemento que tem FName e LName atributos. Os valores de coluna correspondentes são então atribuídos a esses atributos. Esta linha identifica-se 1 como Parent. Este elemento filho é adicionado ao elemento anterior <Employee> .

Esse processo é repetido para o restante das linhas no conjunto de linhas. Observe a importância de ordenar as linhas na tabela universal para que PARA XML EXPLICIT possa processar o conjunto de linhas em ordem e gerar o XML desejado.

Ver também