Функция concat (XQuery)
Принимает от нуля и более строк и возвращает строку, содержащую результат сцепления переданных аргументов.
Синтаксис
fn:concat ($string as xs:string?
,$string as xs:string?
[, ...]) as xs:string
Аргументы
- $string
Необязательная строка для сцепления.
Замечания
Функции требуется как минимум два аргумента. Если в качестве аргумента передана пустая последовательность, она трактуется как строка нулевой длины.
Дополнительные символы (суррогатные пары)
Поведение суррогатных пар в функциях XQuery зависит от уровня совместимости базы данных и, в некоторых случаях, от URI-кода пространства имен по умолчанию для функций. Дополнительные сведения см. в пункте «Функции XQuery учитывают суррогаты» раздела Критические изменения в функциях компонента ядра СУБД в SQL Server 2012. Также см. разделы Уровень совместимости инструкции ALTER DATABASE (Transact-SQL) и Поддержка параметров сортировки и Юникода.
Примеры
В этом разделе приведены примеры запросов XQuery к экземплярам XML, которые хранятся в различных столбцах типа xml образца базы данных AdventureWorks.
А.Применение функции concat() языка XQuery для объединения строк
Для указанного изделия запрос возвращает строку, полученную сцеплением гарантийного строка и гарантийных обязательств. В документе описания каталога элемент <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.