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

Se aplica a:SQL Server

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

Sintaxis

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

Comentarios

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

Por ejemplo, el método query() se usa para especificar una consulta en una instancia XML que se almacena en una variable o columna de tipo de datos xml . A veces, es posible que también desee que la consulta use valores de una variable de Transact-SQL o un parámetro para reunir datos relacionales y XML. Para ello, use la función sql:variable .

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

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

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

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

Esta 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 namespace palabra clave se usa para definir un prefijo de espacio de nombres en el prólogo de 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" />  

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)