Megosztás a következőn keresztül:


Függvények sztringértékeken – sztringhossz

A következőkre vonatkozik:SQL Server

A sztring hosszát adja vissza karakterekben.

Szintaxis

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

Érvek

$arg
Forrássztring, amelynek hosszát ki kell számítani.

Megjegyzések

Ha a $arg értéke üres sorozat, a függvény egy xs:egész számot 0 értéket ad vissza.

Az XQuery-függvényekben a helyettesítő párok viselkedése az adatbázis kompatibilitási szintjétől függ. Ha a kompatibilitási szint 110 vagy újabb, minden helyettesítő pár egyetlen karakternek számít. A korábbi kompatibilitási szintek esetében ezek két karakternek számítanak. További információ: ALTER DATABASE kompatibilitási szintje (Transact-SQL) és rendezési és Unicode-támogatási.

Ha az érték egy 4 bájtos Unicode-karaktert tartalmaz, amelyet két helyettesítő karakter jelöl, az SQL Server egyenként megszámolja a helyettesítő karaktereket.

A paraméter nélküli karakterlánchossz() csak predikátumon belül használható. A következő lekérdezés például a <ROOT> elemet adja vissza:

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

Kiegészítő karakterek (helyettesítő párok)

Az XQuery-függvényekben a helyettesítő párok viselkedése az adatbázis kompatibilitási szintjétől és bizonyos esetekben a függvények alapértelmezett névterének URI-jától függ. További információt az SQL Server 2016 adatbázismotor-funkcióinak kompatibilitástörő változásairóltémakör "XQuery Functions Are Surrogate-Aware" című szakaszában talál. Lásd még ALTER DATABASE kompatibilitási szintjét (Transact-SQL) és rendezési és Unicode-támogatási.

Példák

Ez a témakör XQuery-példákat tartalmaz az AdventureWorks-adatbázis különböző XML- típusú oszlopaiban tárolt XML-példányokra.

Egy. A string-length() XQuery függvény használata a hosszú összefoglaló leírású termékek lekéréséhez

Az 50 karakternél hosszabb összefoglaló leírású termékek esetében az alábbi lekérdezés lekéri a termékazonosítót, az összefoglaló leírás hosszát és magát az összegzést, a <Summary> elemet.

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;  

Jegyezze fel az előző lekérdezésben szereplő következőket:

  • A WHERE záradékban szereplő feltétel csak azokat a sorokat kéri le, ahol az XML-dokumentumban tárolt összefoglaló leírás 200 karakternél hosszabb. A érték() metódust (XML-adattípus)használja.

  • A SELECT záradék csak a kívánt XML-fájlt hozza létre. A query() metódus (XML-adattípus) használatával hozza létre az XML-t, és megadja a szükséges XQuery-kifejezést az ADATOK XML-dokumentumból való lekéréséhez.

Ez egy részleges eredmény:

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. A string-length() XQuery függvény használatával lekérheti azokat a termékeket, amelyek garanciális leírása rövid

Azon termékek esetében, amelyek jótállási leírása 20 karakternél rövidebb, az alábbi lekérdezés lekéri a termékazonosítót, a hosszt, a jótállás leírását és magát a <Warranty> elemet tartalmazó XML-t.

A jótállás a termék egyik funkciója. A <Features> elem után egy választható <Warranty> gyermekelem következik.

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;  

Jegyezze fel az előző lekérdezésben szereplő következőket:

  • lekérdezésben használt névtérelőtagok a pd és wm. Azonosítják a lekérdezett dokumentumban használt névtereket.

  • Az XQuery egy beágyazott FOR ciklust ad meg. A külső FOR ciklusra azért van szükség, mert le szeretné kérni a <ProductDescription> elem ProductModelID attribútumait. A belső FOR ciklusra azért van szükség, mert csak azokat a termékeket szeretné használni, amelyek 20 karakternél rövidebb jótállási jellemzőkkel rendelkeznek.

Ez a részleges eredmény:

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

Lásd még:

XQuery-függvények xml adattípusú