sql:variable() (XQuery)
Представляет переменную, которая содержит реляционное значение SQL внутри выражения XQuery.
Синтаксис
sql:variable("variableName") as xdt:anyAtomicType?
Замечания
Как описано в разделе Привязка реляционных данных внутри XML, при использовании методов XML-данных можно использовать эту функцию, чтобы получить доступ к реляционному значению внутри XQuery.
Например, с помощью метода query() можно выполнять запросы к экземпляру XML, хранящемуся в переменной или столбце типа xml. Иногда, если нужно одновременно передавать реляционные и XML-данные, может также потребоваться использовать в запросе значения из переменных или параметров Transact-SQL. Это можно делать с помощью функции sql:variable.
Значение SQL будет сопоставлено с соответствующим значением XQuery, значению будет присвоен базовый тип XQuery, эквивалентный соответствующему типу SQL.
Ссылаться на экземпляр xml можно только в контексте исходного выражения инструкции вставки XML DML; в противном случае нельзя ссылаться на значения, имеющие тип xml или определяемый пользователем тип данных CLR.
Примеры
А. Передача переменной Transact-SQL в XML с помощью функции sql:variable()
Следующий пример показывает создание экземпляра XML, в котором содержатся следующие данные:
Значение (ProductID) из реляционного столбца. С помощью функции sql:column() это значение связывается с XML.
Значение (ListPrice) из реляционного столбца другой таблицы. В этом случае функция sql:column() также используется для связывания этого значения с XML.
Значение (DiscountPrice) из переменной Transact-SQL. С помощью метода sql:variable() это значение связывается с XML.
Значение (ProductModelName) из столбца типа xml, чтобы сделать запрос более интересным.
Ниже приведен запрос:
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
Обратите внимание на следующие особенности:
XQuery внутри метода query() формирует XML.
Префикс пространства имен в прологе XQuery определяется с помощью ключевого слова namespace. Это возможно потому, что значение атрибута ProductModelName получается из столбца типа CatalogDescription xml, с которым связана схема.
Результат:
<Product ProductID="771" ProductModelID="19"
ProductModelName="Mountain 100"
ListPrice="3399.99" DiscountPrice="2500" />
См. также