Compartir vía


Funciones usadas en valores de cadena: string-length

Se aplica a:SQL Server

Devuelve la longitud de la cadena en caracteres.

Sintaxis

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

Argumentos

$arg
Cadena de origen cuya longitud se va a calcular.

Comentarios

Si el valor de $arg es una secuencia vacía, se devuelve un valor xs:integer de 0.

El comportamiento de los pares suplentes en funciones XQuery depende del nivel de compatibilidad de la base de datos. Si el nivel de compatibilidad es 110 o superior, cada par suplente se cuenta como un carácter individual. Para los niveles de compatibilidad inferiores, se cuentan como dos caracteres. Para obtener más información, vea Nivel de compatibilidad de ALTER DATABASE (Transact-SQL) y Compatibilidad con Intercalación y Unicode.

Si el valor contiene un carácter Unicode de 4 bytes representado por dos caracteres suplentes, SQL Server contará los caracteres suplentes individualmente.

La longitud de cadena() sin un parámetro solo se puede usar dentro de un predicado. Por ejemplo, la consulta siguiente devuelve el <ROOT> elemento :

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

Caracteres adicionales (pares suplentes)

El comportamiento de pares suplentes en las funciones XQuery depende del nivel de compatibilidad de la base de datos y, en algunos casos, del URI del espacio de nombres predeterminado de las funciones. Para obtener más información, vea la sección "XQuery Functions Are Surrogate-Aware" en el tema Cambios importantes en las características del motor de base de datos en SQL Server 2016. Consulte también El nivel de compatibilidad de ALTER DATABASE (Transact-SQL) y la compatibilidad con Intercalación y Unicode.

Ejemplos

En este tema se proporcionan ejemplos de XQuery en las instancias XML almacenadas en varias columnas de tipo xml de la base de datos AdventureWorks.

A. Usar la función string-length() de XQuery para recuperar productos con descripciones resumidas largas

Para los productos cuya descripción de resumen es superior a 50 caracteres, la consulta siguiente recupera el identificador del producto, la longitud de la descripción de resumen y el propio resumen, el <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 lo siguiente en la consulta anterior:

  • La condición de la cláusula WHERE recupera solo las filas donde la descripción resumida almacenada en el documento XML tiene más de 200 caracteres. Usa el método value() (tipo de datos XML).

  • La cláusula SELECT genera solo el XML que desea. Usa el método query() (tipo de datos XML) para construir el XML y especificar la expresión XQuery necesaria para recuperar datos del documento XML.

Éste es un 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. Usar la función de XQuery string-length() para recuperar productos cuya descripción de garantía es corta

En el caso de los productos cuyas descripciones de garantía tienen menos de 20 caracteres, la consulta siguiente recupera EL XML que incluye el identificador del producto, la longitud, la descripción de la garantía y el <Warranty> propio elemento.

Warranty es una de las características del producto. Un elemento secundario opcional <Warranty> sigue después del <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 lo siguiente en la consulta anterior:

  • pd y wm son los prefijos de espacio de nombres que se usan en esta consulta. Identifican los mismos espacios de nombres utilizados en el documento que se va a consultar.

  • La consulta XQuery especifica un bucle FOR anidado. Se requiere el bucle FOR externo, ya que desea recuperar los atributos ProductModelID del <ProductDescription> elemento. El bucle FOR interno es necesario, porque solo desea obtener aquellos productos que tengan descripciones de garantía con menos de 20 caracteres.

Éste es el 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 también

Funciones de XQuery con el tipo de datos xml