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


Функция concat (XQuery)

Принимает от нуля и более строк и возвращает строку, содержащую результат объединения переданных аргументов.

Синтаксис

fn:concat ($string as xs:string?
           ,$string as xs:string?
           [, ...]) as xs:string

Аргументы

  • $string
    Необязательная строка для объединения.

Замечания

Функции требуется как минимум два аргумента. Если в качестве аргумента передана пустая последовательность, она трактуется как строка нулевой длины.

Примеры

В этом разделе приведены примеры запросов XQuery к экземплярам XML, которые хранятся в различных столбцах типа xml образца базы данных AdventureWorks. Обзор этих столбцов см. в разделе Представление типов XML-данных в базе данных AdventureWorks.

А. Применение функции XQuery concat() для объединения строк

Для указанного изделия запрос возвращает строку, полученную сцеплением гарантийного строка и гарантийных обязательств. В документе описания каталога элемент <Warranty> состоит из дочерних элементов <WarrantyPeriod> и <Description>.

WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
    <Product 
        ProductModelID= "{ (/pd:ProductDescription/@ProductModelID)[1] }"
        ProductModelName = "{ sql:column("PD.Name") }" >
        { 
          concat( string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:WarrantyPeriod)[1]), "-",
                  string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:Description)[1])) 
         } 
     </Product>
 ') as Result
FROM Production.ProductModel PD
WHERE  PD.ProductModelID=28

Обратите внимание на следующее в предыдущем запросе:

  • в предложении SELECT CatalogDescription является столбцом типа xml. Вызывается метод query() (тип данных XML), то есть Instructions.query(). Методу query передается в качестве аргумента инструкция XQuery;

  • запрос к документу выполняется при использовании пространства имен, которое определяется по ключевому слову namespace. Дополнительные сведения см. в разделе Пролог XQuery.

Результат:

<Product ProductModelID="28" ProductModelName="Road-450">1 year-parts and labor</Product>

Приведенный запрос получает сведения об указанном изделии. Следующий запрос получает те же сведения по всем изделиям, для которых имеются описания каталога XML. Метод exist() типа данных xml в предложении WHERE возвращает значение True для тех строк, в которых документ XML содержит элемент <ProductDescription>.

WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)

SELECT CatalogDescription.query('
    <Product 
        ProductModelID= "{ (/pd:ProductDescription/@ProductModelID)[1] }" 
        ProductName = "{ sql:column("PD.Name") }" >
        { 
          concat( string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:WarrantyPeriod)[1]), "-",
                  string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:Description)[1])) 
         } 
     </Product>
 ') as Result
FROM Production.ProductModel PD
WHERE CatalogDescription.exist('//pd:ProductDescription ') = 1

Обратите внимание, что логическое значение, возвращаемое методом exist() типа данных xml, сравнивается со значением 1.

Ограничения реализации

Существуют следующие ограничения:

  • в SQL Server функция concat() принимает только значения типа xs:string. Все остальные значения должны быть явно приведены в xs:string или xdt:untypedAtomic.

См. также

Справочник