Compartilhar via


Função string-length (XQuery)

Retorna o comprimento da cadeia de caracteres em caracteres.

Sintaxe

fn:string-length() as xs:integer
fn:string-length($arg as xs:string?) as xs:integer

Argumentos

  • $arg
    Cadeia de caracteres de origem cujo comprimento será computado.

Comentários

Se o valor de $arg for uma sequência vazia, um valor xs:integer de 0 será retornado.

Se o valor contiver um caractere Unicode de 3 bytes, representado por dois caracteres substitutos, o SQL Server contará os caracteres substitutos individualmente.

A função string-length() sem um parâmetro só pode ser usada dentro de um predicado. Por exemplo, a consulta a seguir retorna o elemento <ROOT>:

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

Exemplos

Este tópico fornece exemplos de XQuery em instâncias XML armazenadas em várias colunas do tipo xml no banco de dados AdventureWorks2008R2. Para obter uma visão geral de cada uma dessas colunas, consulte Representação de tipo de dados xml no banco de dados do AdventureWorks2008R2.

A. Usando uma função string-length() XQuery para recuperar produtos com longas descrições resumidas

Para produtos cuja descrição resumida é maior que 50 caracteres, a consulta a seguir recupera a ID do produto, o comprimento da descrição resumida e o próprio resumo, o elemento <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;

Observe o seguinte na consulta anterior:

  • A condição na cláusula WHERE recupera só as linhas em que a descrição resumida armazenada no documento XML é mais longa que 200 caracteres. Ela usa o método value() (tipo de dados XML).

  • A cláusula SELECT simplesmente constrói o XML desejado. Ela usa o método query() (tipo de dados XML) para construir o XML e especificar a expressão XQuery necessária para recuperar dados do documento XML.

Este é um resultado parcial:

Result

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

<Prod ProductID="19">

<LongSummary SummaryLength="214">Our top-of-the-line competition

. Performance-enhancing options include the

innovative HL Frame, super-smooth front suspension, and

traction for all terrain.

</LongSummary>

</Prod>

...

B. Usando a função string-length() XQuery para recuperar produtos cujas descrições de garantia sejam muito curtas

Para produtos cujas descrições de garantia tenham menos que 20 caracteres, a consulta a seguir recupera XML que inclui a ID do produto, o comprimento, a descrição de garantia, e o elemento <Warranty> em si.

A garantia é um dos recursos do produto. Um elemento filho opcional <Warranty> segue após o elemento <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;

Observe o seguinte na consulta anterior:

  • pd e wm são os prefixos de namespace usados nessa consulta. Eles identificam os mesmos namespaces utilizados no documento que está sendo consultado.

  • O XQuery especifica um loop FOR aninhado. O loop FOR exterior é necessário, pois você deseja recuperar os atributos ProductModelID do elemento <ProductDescription>. O loop FOR interno é necessário, porque você deseja somente aqueles produtos que têm descrições de recursos de garantia com menos de 20 caracteres.

Este é o resultado parcial:

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>

...

Consulte também

Referência