Функции расширения XQuery — sql:column()
Область применения: SQL Server
Как описано в разделе привязки реляционных данных внутри XML, можно использовать функцию sql:column(() при использовании методов типа ДАННЫХ XML для предоставления реляционного значения внутри XQuery.
Например, метод query() (тип данных XML) используется для указания запроса к экземпляру XML, хранящейся в переменной или столбце xml-типа . Кроме того, иногда для совмещения реляционных данных с XML-данными бывает необходимо, чтобы запрос обрабатывал значения еще одного столбца, отличного от XML. Для этого используется функция sql:column().
Значение SQL будет сопоставлено с соответствующим значением XQuery, а в качестве типа этого значения будет присвоен базовый тип XQuery, эквивалентный соответствующему типу SQL.
Синтаксис
sql:column("columnName")
Замечания
Обратите внимание, что ссылка на столбец, указанный в функции sql:column() внутри XQuery, ссылается на столбец в строке, обрабатываемой.
В SQL Server можно ссылаться только на xml-экземпляр в контексте исходного выражения инструкции вставки XML-DML . В противном случае нельзя ссылаться на столбцы, которые имеют тип XML или определяемый пользователем тип CLR.
Функция sql:column() не поддерживается в операциях JOIN. Вместо этого можно использовать операцию APPLY.
Примеры
А. Получение реляционного значения внутри XML с помощью функции sql:column()
В следующем примере конструирования XML показано получение значений реляционного столбца, отличного от XML, для связывания реляционных данных с XML-данными.
Запрос формирует XML следующей структуры:
<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"
ProductModelName="Mountain 100" />
Обратите внимание на следующие особенности созданного кода XML.
Значения атрибутов ProductID, ProductName и ProductPrice получены из таблицы Product .
Значение атрибута ProductModelID извлекается из таблицы ProductModel .
Чтобы сделать запрос более интересным, значение атрибута ProductModelName получается из столбца CatalogDescription типа XML. Поскольку данные каталога модели продукта XML хранятся не для всех моделей продуктов, с помощью инструкции
if
получаются только существующие значения.SELECT P.ProductID, CatalogDescription.query(' declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"; <Product ProductID= "{ sql:column("P.ProductID") }" ProductName= "{ sql:column("P.Name") }" ProductPrice= "{ sql:column("P.ListPrice") }" ProductModelID= "{ sql:column("PM.ProductModelID") }" > { if (not(empty(/pd:ProductDescription))) then attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName } else () } </Product> ') as Result FROM Production.ProductModel PM, Production.Product P WHERE PM.ProductModelID = P.ProductModelID AND CatalogDescription is not NULL ORDER By PM.ProductModelID
Обратите внимание на следующие данные из предыдущего запроса:
Поскольку значения получаются из двух разных таблиц, предложение FROM задает пару таблиц. Условие в предложении WHERE фильтрует результаты и получает только те продукты, у которых в каталоге есть описание моделей.
Ключевое слово пространства имен в XQuery Prolog определяет префикс пространства имен XML, "pd", который используется в тексте запроса. Обратите внимание, что эти псевдонимы таблиц, «P» и «PM», задаются в предложении FROM самого запроса.
Функция sql:column() используется для привлечения значений, отличных от XML.
Частичный результат:
ProductID Result
-----------------------------------------------------------------
771 <Product ProductID="771" ProductName="Mountain-100 Silver, 38"
ProductPrice="3399.99" ProductModelID="19"
ProductModelName="Mountain 100" />
...
Следующий запрос создает XML, содержащий сведения о продукте. К этим сведениям относятся ProductID, ProductName, ProductPrice и (если значение доступно) ProductModelName для всех продуктов, относящихся к конкретной модели, ProductModelID=19. Затем XML назначается @x переменной типа XML .
declare @x xml
SELECT @x = CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product
ProductID= "{ sql:column("P.ProductID") }"
ProductName= "{ sql:column("P.Name") }"
ProductPrice= "{ sql:column("P.ListPrice") }"
ProductModelID= "{ sql:column("PM.ProductModelID") }" >
{ if (not(empty(/pd:ProductDescription))) then
attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }
else
()
}
</Product>
')
FROM Production.ProductModel PM, Production.Product P
WHERE PM.ProductModelID = P.ProductModelID
And P.ProductModelID = 19
select @x
См. также
Функции расширения SQL Server XQuery
Сравнение типизированного и нетипизированного XML
XML-данные (SQL Server)
Создание экземпляров данных XML
Методы для типа данных XML
Язык обработки XML-данных (XML DML)