Функции расширения XQuery — sql:variable()

Применимо к:SQL Server

Представляет переменную, которая содержит реляционное значение SQL внутри выражения XQuery.

Синтаксис

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

Замечания

Как описано в разделе Привязка реляционных данных внутри XML, эту функцию можно использовать при использовании методов типа данных XML для предоставления реляционного значения внутри XQuery.

Например, метод query() используется для указания запроса к экземпляру XML, хранящейся в переменной типа данных XML или столбце. Иногда может потребоваться, чтобы запрос использовал значения из переменной Transact-SQL или параметра для объединения реляционных и XML-данных. Для этого используется функция 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.

  • Ключевое namespace слово используется для определения префикса пространства имен в прологе XQuery. Это возможно потому, что значение атрибута ProductModelName получается из столбца типа CatalogDescription xml, с которым связана схема.

Результат:

<Product ProductID="771" ProductModelID="19"   
         ProductModelName="Mountain 100"   
         ListPrice="3399.99" DiscountPrice="2500" />  

См. также

Функции расширения SQL Server XQuery
Сравнение типизированного и нетипизированного XML
XML-данные (SQL Server)
Создание экземпляров данных XML
Методы для типа данных XML
Язык обработки XML-данных (XML DML)