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

Expone una variable que contiene un valor relacional SQL dentro de una expresión XQuery.

Sintaxis

sql:variable("variableName") as xdt:anyAtomicType?

Notas

Como se describe en el tema Enlazar datos relacionales dentro de datos XML, esta función se puede usar cuando se utilicen los métodos de tipo de datos XML para exponer un valor relacional dentro de XQuery.

Por ejemplo, el método query() sirve para especificar una consulta en una instancia XML que está almacenada en una columna o variable de tipo de datos xml. En ocasiones, es posible que también se desee que la consulta utilice valores de una variable Transact-SQL, o un parámetro, para combinar los datos relacionales y XML. Para ello, se utiliza la función sql:variable.

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

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 los valores que son de tipo xml o de un tipo definido por el usuario de Common Language Runtime (CLR).

Ejemplos

A. Usar la función sql:variable() para incorporar una variable Transact-SQL a XML

En el siguiente ejemplo se crea una instancia XML formada por los siguientes elementos:

  • Un valor (ProductID) de una columna no XML. La función sql:column() se utiliza para enlazar este valor en el XML.

  • Un valor (ListPrice) de una columna no XML de otra tabla. De nuevo, se utiliza sql:column() para enlazar este valor en el XML.

  • Un valor (DiscountPrice) de una variable Transact-SQL. El método sql:variable() se utiliza para enlazar este valor en el XML.

  • Un valor (ProductModelName) de una columna de tipo xml para que la consulta sea más interesante.

Ésta es la consulta:

DECLARE @price money

SET @price=2500.00
SELECT ProductID, Production.ProductModel.ProductModelID,CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";

       <Product 
           ProductID="{ sql:column("Production.Product.ProductID") }"
           ProductModelID= "{ sql:column("Production.Product.ProductModelID") }"
           ProductModelName="{/pd:ProductDescription[1]/@ProductModelName }"
           ListPrice="{ sql:column("Production.Product.ListPrice") }"
           DiscountPrice="{ sql:variable("@price") }"
        />') 
FROM Production.Product 
JOIN Production.ProductModel
ON Production.Product.ProductModelID = Production.ProductModel.ProductModelID
WHERE ProductID=771

Observe lo siguiente en la consulta anterior:

  • La función XQuery incluida en el método query() construye el XML.

  • La palabra clave namespace se utiliza para definir un prefijo de espacio de nombres en el prólogo de las consultas XQuery. Esto se hace porque el valor del atributo ProductModelName se recupera de la columna de tipo CatalogDescription xml, que tiene un esquema asociado a ella.

El resultado es el siguiente:

<Product ProductID="771" ProductModelID="19" 
         ProductModelName="Mountain 100" 
         ListPrice="3399.99" DiscountPrice="2500" />