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


Функции расширения 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)