Функция concat (XQuery)
Принимает от нуля и более строк и возвращает строку, содержащую результат сцепления переданных аргументов.
Синтаксис
fn:concat ($string as xs:string?
,$string as xs:string?
[, ...]) as xs:string
Аргументы
- $string
Необязательная строка для сцепления.
Замечания
Функции требуется как минимум два аргумента. Если в качестве аргумента передана пустая последовательность, она трактуется как строка нулевой длины.
Примеры
В этом разделе представлены примеры XQuery-запросов к экземплярам XML-данных, хранящимся в различных столбцах типа xml в образце базы данных База данных AdventureWorks2008R2. Обзор этих столбцов см. в разделе Представление типов данных XML в базе данных AdventureWorks2008R2.
А. Применение функции 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(). Инструкция XQuery задана как аргумент метода query.
Запрос к документу выполняется при использовании пространства имен, которое определяется по ключевому слову 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.