Поделиться через


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" />