sql:variable() (XQuery)
Устанавливает переменную, которая содержит реляционное значение SQL внутри экземпляра XML-данных.
Синтаксис
sql:variable("variableName") as xdt:anyAtomicType?
Замечания
Как описано в подразделе Привязка реляционных данных внутри XML, при использовании методов типа данных XML эта функция позволяет производить доступ к реляционному значению внутри XML.
Например, с помощью метода query() можно выполнять запросы к экземпляру XML, хранящемуся в переменной или столбце типа xml. Иногда, если нужно одновременно передавать реляционные и XML-данные, может также потребоваться использовать в запросе значения из переменных или аргументов Transact-SQL. Это можно делать с помощью функции sql:variable.
Значение SQL будет сопоставлено с соответствующим значением XQuery, значению будет присвоен базовый тип XQuery, эквивалентный соответствующему типу SQL.
В SQL Server 2005 ссылаться на значения, имеющие тип 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" />
См. также
Справочник
Функции расширения запросов XQuery в SQL Server
Основные понятия
Типизированный и нетипизированный XML
Тип данных xml
Формирование XML-экземпляров
Язык модификации XML-данных (XML DML)