Compartir a través de


sql:column() (función de XQuery)

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

Por ejemplo, query() (método de tipo de datos xml) se utiliza para especificar una consulta en una instancia XML que se almacena 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, utilice la función sql:column().

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

Sintaxis

sql:column("columnName")

Notas

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

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

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

Ejemplos

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

Al crear XML, el ejemplo siguiente muestra cómo 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, ProductNamey ProductPrice se obtienen de la tabla Product.

  • El valor de atributo ProductModelID se obtiene de la tabla ProductModel.

  • Para que la consulta sea más interesante, el valor de atributo ProductModelName se obtiene de la columna CatalogDescription de 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 sólo 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 sólo productos cuyos modelos disponen de descripciones de catálogo.

  • La palabra clave namespace del prólogo de las consultas XQuery define el prefijo de espacio de nombres XML, "pd", utilizado 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 utiliza para recuperar valores no XML en 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 variable @x 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