Функция string-length (XQuery)
Возвращает длину строки в символах.
Синтаксис
fn:string-length() as xs:integer
fn:string-length($arg as xs:string?) as xs:integer
Аргументы
- $arg
Строка источника, длина которой подлежит вычислению.
Замечания
Если значение свойства $arg представляет собой пустую последовательность, то элементу xs:integer возвращается значение 0.
Если значение содержит 3-байтовый символ в формате Юникод, представленный двумя суррогатными символами, то сервер SQL Server 2005 будет подсчитывать суррогатные символы по отдельности.
Функция string-length() без параметра может использоваться только внутри предиката. Например, следующий запрос возвращает элемент <ROOT
>:
declare @x xml
set @x='<ROOT>Hello</ROOT>'
select @x.query('/ROOT[string-length()=5]')
Примеры
В этом подразделе представлены примеры использования XQuery с экземплярами XML, хранимыми в различных столбцах типа xml в базе данных AdventureWorks. Обзор каждого из этих столбцов см. в разделе Представление типов 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>
...
Б. Использование функции string-length() XQuery для получения продуктов с очень короткими описаниями гарантии
Для продуктов, чьи гарантийные описания меньше 20 символов в длину, следующий запрос запрашивает XML, который включает идентификатор продукта, длину, гарантийное описание гарантии и элемент <Warranty
> как таковой.
Гарантия — это одна из характеристик продукта. Необязательный дочерний элемент <Warranty
> следует после элемента <Features
>.
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, так как нужно получить атрибуты ProductModelID элемента <
ProductDescription
>. Внутренний цикл 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>
...
См. также
Справочник
Применение функций XQuery к типу данных XML