Функции со строковыми значениями — concat
Применимо к:SQL Server
Принимает от нуля и более строк и возвращает строку, содержащую результат сцепления переданных аргументов.
Синтаксис
fn:concat ($string as xs:string?
,$string as xs:string?
[, ...]) as xs:string
Аргументы
$string
Необязательная строка для сцепления.
Замечания
Функции требуется как минимум два аргумента. Если в качестве аргумента передана пустая последовательность, она трактуется как строка нулевой длины.
Дополнительные символы (суррогатные пары)
Поведение суррогатных пар в функциях XQuery зависит от уровня совместимости базы данных и, в некоторых случаях, от URI-кода пространства имен по умолчанию для функций. Дополнительные сведения см. в разделе "Функции XQuery с суррогатной поддержкой" статьи "Критические изменения функций ядра СУБД в SQL Server 2016". Дополнительные сведения см. в разделе ALTER DATABASE Compatibility Level (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.
Запрос к документу выполняется при использовании пространства имен, Поэтому ключевое слово пространства имен используется для определения префикса пространства имен. Дополнительные сведения см. в разделе XQuery Prolog.
Результат:
<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.
Ограничения реализации
Существуют следующие ограничения:
- Функция concat() в SQL Server принимает только значения типа xs:string. Все остальные значения должны быть явно приведены в xs:string или xdt:untypedAtomic.