Функции со строковыми значениями — string-length
Область применения: SQL Server
Возвращает длину строки в символах.
Синтаксис
fn:string-length() as xs:integer
fn:string-length($arg as xs:string?) as xs:integer
Аргументы
$arg
Строка источника, длина которой подлежит вычислению.
Замечания
Если значение $arg является пустой последовательностью, возвращается целочисленное значение xs:integer 0.
Поведение суррогатных пар в функциях XQuery зависит от уровня совместимости базы данных. Если уровень совместимости 110 или выше, каждая суррогатная пара рассматривается как один символ. При более низких уровнях совместимости они рассматриваются как два символа. Дополнительные сведения см. в статьях ALTER DATABASE Compatibility Level (Transact-SQL) и Collation and Unicode Support.
Если значение содержит 4-байтовый символ Юникода, представленный двумя суррогатными символами, SQL Server будет подсчитывать суррогатные символы по отдельности.
String-length() без параметра можно использовать только внутри предиката. Например, следующий запрос возвращает <ROOT
> элемент:
DECLARE @x xml;
SET @x='<ROOT>Hello</ROOT>';
SELECT @x.query('/ROOT[string-length()=5]');
Дополнительные символы (суррогатные пары)
Поведение суррогатных пар в функциях XQuery зависит от уровня совместимости базы данных и, в некоторых случаях, от URI-кода пространства имен по умолчанию для функций. Дополнительные сведения см. в разделе "Функции XQuery с суррогатной поддержкой" статьи "Критические изменения функций ядро СУБД в SQL Server 2016". Дополнительные сведения см. в разделе ALTER DATABASE Compatibility Level (Transact-SQL) и Параметры сортировки и Поддержка Юникода.
Примеры
В этом разделе приведены примеры XQuery для экземпляров XML, хранящихся в различных столбцах типов XML в базе данных AdventureWorks.
А. Использование функции string-length() языка XQuery для получения продуктов с длинными сводными описаниями
Для продуктов, описание сводки которых превышает 50 символов, следующий запрос получает идентификатор продукта, длину сводного описания и сам сводку, <Summary
> элемент.
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' as pd)
SELECT CatalogDescription.query('
<Prod ProductID= "{ /pd:ProductDescription[1]/@ProductModelID }" >
<LongSummary SummaryLength =
"{string-length(string( (/pd:ProductDescription/pd:Summary)[1] )) }" >
{ string( (/pd:ProductDescription/pd:Summary)[1] ) }
</LongSummary>
</Prod>
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.value('string-length( string( (/pd:ProductDescription/pd:Summary)[1]))', 'decimal') > 200;
Обратите внимание на следующие данные из предыдущего запроса:
Условие в предложении WHERE получает только строки, в которых описания сводки, хранимые в XML-документе, длиннее 200 символов. Он использует метод value() (тип данных XML).
Предложение SELECT просто выстраивает необходимый код XML. Он использует метод query() (тип данных XML) для создания XML и указания необходимого выражения XQuery для получения данных из XML-документа.
Частичный результат:
Result
-------------------
<Prod ProductID="19">
<LongSummary SummaryLength="214">Our top-of-the-line competition
mountain bike. Performance-enhancing options include the
innovative HL Frame, super-smooth front suspension, and
traction for all terrain.
</LongSummary>
</Prod>
...
B. Использование функции string-length() языка XQuery для получения продуктов с короткими описаниями гарантии
Для продуктов, описание гарантии которых меньше 20 символов, следующий запрос извлекает XML-код, включающий идентификатор продукта, длину, описание гарантии и <Warranty
> сам элемент.
Гарантия — это одна из характеристик продукта. Необязательный дочерний элемент следует послеFeatures
> <элемента.<Warranty
>
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('
for $ProdDesc in /pd:ProductDescription,
$pf in $ProdDesc/pd:Features/wm:Warranty
where string-length( string(($pf/wm:Description)[1]) ) < 20
return
<Prod >
{ $ProdDesc/@ProductModelID }
<ShortFeature FeatureDescLength =
"{string-length( string(($pf/wm:Description)[1]) ) }" >
{ $pf }
</ShortFeature>
</Prod>
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('/pd:ProductDescription')=1;
Обратите внимание на следующие данные из предыдущего запроса:
pd и wm — это префиксы пространства имен, используемые в этом запросе. Они определяют то же пространство имен, что используется в запрашиваемом документе;
XQuery указывает вложенный цикл FOR. Требуется внешний цикл FOR, так как требуется получить атрибуты <
ProductDescription
> ProductModelID элемента. Внутренний цикл FOR требуется, так как нужны только продукты, имеющие описания характеристик гарантии меньше 20 символов в длину.
Частичный результат:
Result
-------------------------
<Prod ProductModelID="19">
<ShortFeature FeatureDescLength="15">
<wm:Warranty
xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>
<wm:Description>parts and labor</wm:Description>
</wm:Warranty>
</ShortFeature>
</Prod>
...