Compartir a través de


string-length (función de XQuery)

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.

Notas

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

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

string-length() sin un parámetro se puede usar sólo dentro de un predicado. Por ejemplo, la siguiente consulta devuelve el elemento <ROOT>:

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

Ejemplos

En este tema se ofrecen ejemplos de consultas XQuery con instancias XML almacenadas en varias columnas de tipo xml en la base de datos AdventureWorks. Para obtener información general de cada una de estas columnas, consulte Representación de tipo de datos xml en la base de datos AdventureWorks.

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

Para productos cuya descripción resumida tiene más de 50 caracteres, la consulta siguiente recupera el Id. de producto, la longitud de la descripción resumida y el resumen en sí, el 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 lo siguiente en la consulta anterior:

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

  • La cláusula SELECT genera sólo el XML que desea. Utiliza el método de tipo de datos XML query() 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 muy corta

Para productos cuya descripción de garantía tiene menos de 20 caracteres, la consulta siguiente recupera XML que incluye el Id. de producto, la longitud, la descripción de garantía y el elemento <Warranty> en sí.

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

  • pd y wm son los prefijos de espacio de nombres utilizados 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. El bucle FOR externo es necesario, porque desea recuperar los atributos ProductModelID del elemento <ProductDescription>. El bucle FOR interno es necesario, porque sólo 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>
...