Compartir a través de


Consultas XQuery con jerarquía

Se aplica a:SQL Server

La mayoría de las columnas de tipo xml de la base de datos AdventureWorks son documentos semiestructurados. Por lo tanto, los documentos almacenados en cada fila pueden tener un aspecto diferente. Los ejemplos de consultas incluidos en este tema muestran cómo extraer información de estos documentos.

Ejemplos

A. A partir de los documentos de instrucciones de fabricación, recupere ubicaciones de los centros de trabajo junto con el primer paso del proceso de fabricación en esas ubicaciones

Para el modelo de producto 7, la consulta construye XML que incluye el <ManuInstr> elemento, con los atributos ProductModelID y ProductModelName, y uno o varios <Location> elementos secundarios.

Cada <Location> elemento tiene su propio conjunto de atributos y un <step> elemento secundario. Este <step> elemento secundario es el primer paso de fabricación en la ubicación del centro de trabajo.

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
   \<ManuInstr  ProdModelID = "{sql:column("Production.ProductModel.ProductModelID") }"   
                ProductModelName = "{ sql:column("Production.ProductModel.Name") }" >  
            {   
              for $wc in //AWMI:root/AWMI:Location  
              return  
                <Location>  
                 {$wc/@* }  
                 <step1> { string( ($wc//AWMI:step)[1] ) } </step1>  
                </Location>  
            }  
          </ManuInstr>  
') as Result  
FROM Production.ProductModel  
WHERE ProductModelID=7  

Observe lo siguiente en la consulta anterior:

  • La palabra clave de espacio de nombres en XQuery Prolog define un prefijo de espacio de nombres. Este prefijo se utiliza posteriormente en el cuerpo de la consulta.

  • Los tokens de contexto, {) y (}, se utilizan para cambiar la consulta de construcción de XML a evaluación de consulta.

  • Sql :column() se usa para incluir un valor relacional en el XML que se está construyendo.

  • Al construir el <Location> elemento, $wc/@* recupera todos los atributos de ubicación del centro de trabajo.

  • La función string() devuelve el valor de cadena del <step> elemento .

Éste es un resultado parcial:

<ManuInstr ProdModelID="7" ProductModelName="HL Touring Frame">  
   <Location LocationID="10" SetupHours="0.5"   
            MachineHours="3" LaborHours="2.5" LotSize="100">  
     <step1>Insert aluminum sheet MS-2341 into the T-85A   
             framing tool.</step1>  
   </Location>  
   <Location LocationID="20" SetupHours="0.15"   
            MachineHours="2" LaborHours="1.75" LotSize="1">  
      <step1>Assemble all frame components following   
             blueprint 1299.</step1>  
   </Location>  
...  
</ManuInstr>   

B. Buscar todos los números de teléfono de la columna AdditionalContactInfo

La consulta siguiente recupera números de teléfono adicionales para un contacto de cliente específico mediante la búsqueda de toda la jerarquía del <telephoneNumber> elemento. Dado que el <telephoneNumber> elemento puede aparecer en cualquier parte de la jerarquía, la consulta usa el operador descendiente y self (//) en la búsqueda.

SELECT AdditionalContactInfo.query('  
 declare namespace ci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";  
 declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";  
for $ph in /ci:AdditionalContactInfo//act:telephoneNumber  
   return  
      $ph/act:number  
') as x  
FROM  Person.Contact  
WHERE ContactID = 1  

El resultado es el siguiente:

\<act:number   
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
  111-111-1111  
\</act:number>  
\<act:number   
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
  112-111-1111  
\</act:number>  

Para recuperar solo los números de teléfono de nivel superior, específicamente los <telephoneNumber> elementos secundarios de <AdditionalContactInfo>, la expresión FOR de la consulta cambia a

for $ph in /ci:AdditionalContactInfo/act:telephoneNumber.

Consulte también

Conceptos básicos de XQuery
Construcción de XML (XQuery)
Datos XML (SQL Server)