Condividi tramite


Funzione string-length (XQuery)

Restituisce la lunghezza della stringa in caratteri.

Sintassi

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

Argomenti

  • $arg
    Stringa di origine di cui calcolare la lunghezza.

Osservazioni

Se il valore di $arg è una sequenza vuota, viene restituito il valore xs:integer 0.

Se il valore contiene un carattere Unicode a 3 byte rappresentato da due caratteri surrogati, SQL Server calcolerà i caratteri surrogati singolarmente.

La funzione string-length() può essere utilizzata senza un parametro solo all'interno di un predicato. Ad esempio, la query seguente restituisce l'elemento <ROOT>:

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

Esempi

In questo argomento vengono forniti esempi di utilizzo del linguaggio XQuery sulle istanze XML archiviate in diverse colonne di tipo xml nel database AdventureWorks. Per una panoramica su ognuna di queste colonne, vedere Rappresentazione del tipo di dati XML nel database AdventureWorks.

A. Utilizzo della funzione XQuery string-length() per il recupero di prodotti con descrizioni di riepilogo lunghe

Per i prodotti con descrizioni di riepilogo di lunghezza superiore a 50 caratteri, la query seguente recupera l'ID prodotto, la lunghezza della descrizione di riepilogo e il riepilogo stesso, ovvero l'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

Dalla query precedente si noti quanto segue:

  • La condizione nella clausola WHERE recupera solo le righe in cui la descrizione di riepilogo archiviata nel documento XML supera i 200 caratteri di lunghezza. Utilizza il metodo value() (tipo di dati XML).

  • La clausola SELECT costruisce il codice XML desiderato. Utilizza il metodo query() (tipo di dati XML) per la costruzione del codice XML e per specificare l'espressione XQuery necessaria per il recupero dei dati dal documento XML.

Risultato parziale:

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. Utilizzo della funzione XQuery string-length() per il recupero di prodotti con descrizioni della garanzia molto brevi

Per i prodotti con descrizioni della garanzia di lunghezza inferiore a 20 caratteri, la query seguente recupera il codice XML che include ID prodotto, lunghezza, descrizione della garanzia e l'elemento <Warranty>.

La garanzia è una delle caratteristiche del prodotto. Un elemento figlio <Warranty> facoltativo segue dopo l'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

Dalla query precedente si noti quanto segue:

  • pd e wm sono i prefissi degli spazi dei nomi utilizzati in questa query. Identificano gli stessi spazi dei nomi utilizzati nel documento su cui viene eseguita la query.

  • L'espressione XQuery specifica un ciclo FOR nidificato. Il ciclo FOR esterno è necessario, poiché si desidera recuperare gli attributi ProductModelID dell'elemento <ProductDescription>. Il ciclo FOR interno è necessario, poiché si desiderano solo i prodotti con descrizioni della caratteristica di garanzia di lunghezza inferiore a 20 caratteri.

Risultato parziale:

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

Vedere anche

Riferimento