Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Область применения: 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)