Compartir por


Columnas con un nombre

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance

A continuación se exponen las condiciones específicas en las que se asignan al XML resultante las columnas con nombre de los conjuntos de filas, con distinción entre mayúsculas de minúsculas:

  • El nombre de la columna empieza por @.

  • El nombre de columna no comienza con un signo (@).

  • El nombre de columna no comienza con un signo en (@) y contiene una marca de barra diagonal (/)

  • Varias columnas comparten el mismo prefijo.

  • Una columna tiene un nombre distinto.

El nombre de la columna empieza por (@).

Si el nombre de columna comienza con un signo en (@) y no contiene una marca de barra diagonal (/), se crea un atributo del elemento row que tiene el valor de columna correspondiente. Por ejemplo, la consulta siguiente devuelve un conjunto de filas de dos columnas (@PmId, Name). En el XML resultante, se agrega un atributo PmId al elemento row correspondiente y se le asigna un valor de ProductModelID.

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

El resultado es el siguiente:

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

Los atributos deben aparecer antes que cualquier otro tipo de nodo, como nodos de elemento y nodos de texto, en el mismo nivel. La consulta siguiente devolverá un error:

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

El nombre de columna no comienza con un signo (@)

Si el nombre de columna no comienza con un signo en (@), no es una de las pruebas del nodo XPath y no contiene una barra diagonal (/), se crea un elemento XML que es un subelemento del elemento row, row de forma predeterminada.

La consulta siguiente especifica el nombre de la columna, el resultado. Por tanto, se agrega un elemento secundario result al elemento row.

SELECT 2 + 2 as result
for xml PATH;

El resultado es el siguiente:

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

La consulta siguiente especifica el nombre de columna, ManuWorkCenterInformation, para el XML devuelto por el XQuery especificado en la columna Instructions de tipo xml. Por tanto, se agrega un elemento ManuWorkCenterInformation como elemento secundario del elemento 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;

El resultado es el siguiente:

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

El nombre de columna no comienza con un signo en (@) y contiene una marca de barra diagonal (/)

Si el nombre de columna no comienza con un signo en (@), pero contiene una marca de barra diagonal (/), el nombre de columna indica una jerarquía XML. or ejemplo, si el nombre de la columna es "Nombre1/Nombre2/Nombre3.../Nombren", cada Nombrei representa un nombre de elemento anidado en el elemento de fila actual (para i = 1) o que está bajo el elemento que tiene el nombre Nombrei-1. Si Nombren comienza por @, se asigna a un atributo del elemento Nombren-1.

Por ejemplo, la consulta siguiente devuelve un identificador de empleado y un nombre que se representan como un elemento complejo EmpName que contiene un First, Middle y Last (apellido).

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;

Los nombres de columna se utilizan como una ruta de acceso en la creación de XML en el modo PATH. El nombre de columna que contiene valores de identificador de empleado, comienza por "@". Por lo tanto, se agrega un atributo, EmpID, al elemento row. Todas las demás columnas incluyen una marca de barra diagonal (/) en el nombre de columna que indica la jerarquía. El XML resultante tendrá el elemento secundario EmpName debajo del elemento row, mientras que el elemento secundario EmpName tendrá los elementos secundarios First, Middle y Last.

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

El valor de la inicial del empleado es Null y, de forma predeterminada, el valor Null se asigna a la ausencia del elemento o atributo. Si desea que se generen elementos para los valores NULL, puede especificar la directiva ELEMENTS con XSINIL tal y como se muestra en esta 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;

El resultado es el siguiente:

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

De forma predeterminada, el modo PATH genera XML centrado en elementos. Por tanto, la especificación de la directiva ELEMENTS en una consulta de modo PATH no tiene ningún efecto. No obstante, tal y como se muestra en el ejemplo anterior, la directiva ELEMENTS resulta útil con XSINIL a fin de generar elementos para valores Null.

Además del Id. y el nombre, la consulta siguiente recupera una dirección del empleado. Según la ruta de acceso de los nombres de las columnas de direcciones, se agregará un elemento secundario Address al elemento row y los detalles de la dirección se agregarán como elemento secundario del 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;

El resultado es el siguiente:

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

Varias columnas comparten el mismo prefijo de ruta de acceso

Si varias columnas posteriores comparten el mismo prefijo de ruta de acceso, se agrupan bajo el mismo nombre. Si se usan prefijos de espacio de nombres diferentes aunque estén enlazados al mismo espacio de nombres, una ruta de acceso se considera diferente. En la consulta anterior, las columnas FirstName, MiddleName y LastName comparten el mismo prefijo EmpName. Por lo tanto, se agregan como elementos secundarios del elemento EmpName. Lo mismo ocurrió al crear el elemento Address en el ejemplo anterior.

Una columna tiene un nombre diferente

Si aparece una columna con un nombre distinto, interrumpirá la agrupación, tal y como se muestra en la siguiente consulta modificada. La consulta interrumpe la agrupación de FirstName, MiddleName y LastName, como se especifica en la consulta anterior, agregando columnas de dirección entre las columnas FirstName y 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, la consulta crea dos elementos EmpName. El primer elemento EmpName tiene el elemento secundario FirstName y el segundo elemento EmpName tiene los elementos secundarios MiddleName y LastName.

El resultado es el siguiente:

<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 también