Funciones de extensión de XQuery: sql:column()

Se aplica a:SQL Server

Como se describe en el tema Enlace de datos relacionales dentro de XML, puede usar la función sql:column(() al usar métodos de tipo de datos XML para exponer un valor relacional dentro de XQuery.

Por ejemplo, el método query() (tipo de datos XML) se usa para especificar una consulta en una instancia XML almacenada en una variable o columna de tipo xml . En algunos casos, es posible que desee que la consulta utilice valores de una columna no XML para obtener datos relacionales y XML al mismo tiempo. Para ello, se usa la función sql:column().

El valor SQL se asignará a un valor XQuery correspondiente y su tipo será un tipo base XQuery equivalente al tipo SQL correspondiente.

Sintaxis

  
sql:column("columnName")  

Comentarios

Tenga en cuenta que la referencia a una columna especificada en la función sql:column() dentro de una XQuery hace referencia a una columna de la fila que se está procesando.

En SQL Server, solo puede hacer referencia a una instancia xml en el contexto de la expresión de origen de una instrucción insert XML-DML; de lo contrario, no puede hacer referencia a columnas de tipo xml o de un tipo definido por el usuario CLR.

La función sql:column() no se admite en las operaciones JOIN. En su lugar, se puede utilizar la operación APPLY.

Ejemplos

A. Usar sql:column() para recuperar el valor relacional en XML

En la construcción de XML, en el ejemplo siguiente se muestra cómo se pueden recuperar valores de una columna relacional no XML para enlazar datos XML y relacionales.

La consulta crea XML con el formato siguiente:

<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"   
  ProductModelName="Mountain 100" />  

Tenga en cuenta las siguientes observaciones acerca del XML creado:

  • Los valores de atributo ProductID, ProductName y ProductPrice se obtienen de la tabla Product .

  • El valor del atributo ProductModelID se recupera de la tabla ProductModel .

  • Para que la consulta sea más interesante, el valor del atributo ProductModelName se obtiene de la columna CatalogDescription del tipo xml. Dado que no toda la información del catálogo de modelos de productos XML se almacena, la instrucción if se utiliza para recuperar el valor solo si existe.

    SELECT P.ProductID, CatalogDescription.query('  
    declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
           <Product   
               ProductID=       "{ sql:column("P.ProductID") }"  
               ProductName=     "{ sql:column("P.Name") }"  
               ProductPrice=    "{ sql:column("P.ListPrice") }"  
               ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
               { if (not(empty(/pd:ProductDescription))) then  
                 attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
                else   
                   ()  
    }  
            </Product>  
    ') as Result  
    FROM Production.ProductModel PM, Production.Product P  
    WHERE PM.ProductModelID = P.ProductModelID  
    AND   CatalogDescription is not NULL  
    ORDER By PM.ProductModelID  
    

Observe lo siguiente en la consulta anterior:

  • Dado que los valores se recuperan de dos tablas diferentes, la cláusula FROM especifica dos tablas. La condición en la cláusula WHERE filtra el resultado y recupera solo productos cuyos modelos disponen de descripciones de catálogo.

  • La palabra clave del espacio de nombres de XQuery Prolog define el prefijo del espacio de nombres XML , "pd", que se usa en el cuerpo de la consulta. Observe que los alias de tabla, "P" y "PM", se definen en la cláusula FROM de la propia consulta.

  • La función sql:column() se usa para traer valores que no son XML dentro de XML.

Éste es el resultado parcial:

ProductID               Result  
-----------------------------------------------------------------  
771         <Product ProductID="771"                   ProductName="Mountain-100 Silver, 38"   
                  ProductPrice="3399.99" ProductModelID="19"   
                  ProductModelName="Mountain 100" />  
...  

La consulta siguiente crea XML que contiene información específica del producto. Esta información incluye ProductID, ProductName, ProductPrice y, si está disponible, ProductModelName para todos los productos que pertenecen a un modelo específico, ProductModelID=19. A continuación, el XML se asigna a la @x variable de tipo xml .

declare @x xml  
SELECT @x = CatalogDescription.query('  
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
       <Product   
           ProductID=       "{ sql:column("P.ProductID") }"  
           ProductName=     "{ sql:column("P.Name") }"  
           ProductPrice=    "{ sql:column("P.ListPrice") }"  
           ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
           { if (not(empty(/pd:ProductDescription))) then  
             attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
            else   
               ()  
}  
        </Product>  
')   
FROM Production.ProductModel PM, Production.Product P  
WHERE PM.ProductModelID = P.ProductModelID  
And P.ProductModelID = 19  
select @x  

Consulte también

Funciones de extensión de XQuery en SQL Server
Comparar XML con tipo y XML sin tipo
Datos XML (SQL Server)
Crear instancias de datos XML
Métodos del tipo de datos xml
Lenguaje de manipulación de datos XML (XML DML)