Partilhar via


Funções em Valores da Cadeia de Caracteres – string-length

Aplica-se: SQL Server

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.

O comportamento de pares substitutos em funções XQuery depende do nível de compatibilidade do banco de dados. Se o nível de compatibilidade for 110 ou posterior, cada par substituto será contado como um único caractere. Em níveis de compatibilidade anteriores, eles são contados como dois caracteres. Para obter mais informações, consulte Nível de compatibilidade ALTER DATABASE (Transact-SQL) e Suporte a ordenação e Unicode.

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

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

DECLARE @x xml;  
SET @x='<ROOT>Hello</ROOT>';  
SELECT @x.query('/ROOT[string-length()=5]');  

Caracteres suplementares (pares substitutos)

O comportamento de pares substitutos em funções XQuery depende do nível de compatibilidade do banco de dados e, em alguns casos, o URI do namespace padrão para funções. Para obter mais informações, consulte a seção "As funções XQuery reconhecem substitutos" no tópico Alterações significativas nos recursos do Mecanismo de Banco de Dados no SQL Server 2016. Consulte também Nível de compatibilidade ALTER DATABASE (Transact-SQL) e Suporte a ordenação e Unicode.

Exemplos

Este tópico fornece exemplos de XQuery em relação a instâncias XML armazenadas em várias colunas de tipo xml no banco de dados AdventureWorks.

R. 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 <Summary> elemento.

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. Ele usa o método value() (tipo de dados XML).

  • A cláusula SELECT simplesmente constrói o XML desejado. Ele 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   
             mountain bike. 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 curtas

Para produtos cujas descrições de garantia têm menos de 20 caracteres, a consulta a seguir recupera XML que inclui a ID do produto, o comprimento, a descrição da garantia e o <Warranty> próprio elemento.

A garantia é um dos recursos do produto. Um elemento filho opcional <Warranty> segue após o <Features> elemento.

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 nesta consulta. Eles identificam os mesmos namespaces utilizados no documento que está sendo consultado.

  • O XQuery especifica um loop FOR aninhado. O loop FOR externo é necessário, pois você deseja recuperar os atributos ProductModelID do <ProductDescription> elemento. 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>  
...  

Confira também

Funções XQuery em Tipos de Dados XML