Может сложиться ситуация, когда в запросе XQuery нужно получить значение поля sql-запроса или внешней переменной. Для таких целей в SQL Server-е введены две функции расширения: variable и column, которые должны находиться в неком пространстве имен с префиксом sql. Если в запросе объявляется какое-либо пространство имен с тем же префиксом sql, выше обозначенные функции становятся недоступными. Надеюсь, эту ошибку, как и бесчисленное множество других, разработчики поправят к релизу.
В функцию sql:variable передается один параметр – строковый литерал, значение которого трактуется как имя переменной простого типа во внешней области видимости. Функция возвращает скалярное значение этой переменной. Например:
declare @xml xmlset @xml = '<fam> <husband income="180">alex</husband> <wife income="161">rosa</wife> <son income="90">dima</son></fam>' declare @i intset @i = 150select @xml::query('/fam/*[@income < sql:variable("@i")]') |
Здесь выбираются все дочерние элементы fam, у которых атрибут income меньше значения внешней переменной i.
Похожим образом используется функция sql:column. Она позволяет получить значение поля из внешнего запроса.
Например, следующий запрос содержит в себе XQuery-подзапрос, обращающийся к колонке id внешнего SQL-запроса.
select fam::query('<fam id = "{sql:column("id")}"> {/fam/*} </fam>')from fams |
Результат:
<fam id="1"> <husband income="180">alex</husband> <wife income="161">rosa</wife> <son income="90">dima</son></fam> |
С помощью этой функции нельзя обращаться к колонкам XML-типа.