Функция 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 будет подсчитывать суррогатные символы по отдельности.

Функция string-length() без параметра может использоваться только внутри предиката. Например, следующий запрос возвращает элемент <ROOT>:

declare @x xml;
set @x='<ROOT>Hello</ROOT>';
select @x.query('/ROOT[string-length()=5]');

Примеры

В этом разделе представлены примеры XQuery-запросов к экземплярам XML-данных, хранящимся в различных столбцах типа xml в базе данных База данных AdventureWorks2008R2. Обзор каждого из этих столбцов см. в разделе Представление типов данных XML в базе данных AdventureWorks2008R2.

А. Использование функции 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-документа.

Частичный результат:

Результат

-------------------

<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 символов в длину.

Частичный результат:

Результат

-------------------------

<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>

...

См. также

Справочник