sql:variable() (función de XQuery)
Expone una variable que contiene un valor relacional SQL dentro de una instancia de datos XML.
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 XML.
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.
En SQL Server 2005, no se puede hacer referencia a valores de tipo xml o a 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 utilizasql:column()
para enlazar este valor en el XML. - Un valor (
DiscountPrice
) de una variable Transact-SQL. El métodosql: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 atributoProductModelName
se recupera de la columna de tipoCatalogDescription 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" />
Vea también
Referencia
Funciones de extensión de XQuery en SQL Server
Conceptos
XML con tipo y sin tipo
Tipo de datos xml
Generar instancias XML
Lenguaje de manipulación de datos XML (XML DML)