Sdílet prostřednictvím


Funkce pro řetězcové hodnoty – délka řetězce

platí pro:SQL Server

Vrátí délku řetězce v značce.

Syntax

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

Argumenty

$arg
Zdrojový řetězec, jehož délka se má vypočítat.

Poznámky

Pokud je hodnota $arg prázdná sekvence, vrátí se xs:integer hodnota 0.

Chování náhradních párů ve funkcích XQuery závisí na úrovni kompatibility databáze. Pokud je úroveň kompatibility 110 nebo novější, počítá se každý náhradní pár jako jeden znak. U dřívějších úrovní kompatibility se započítávají jako dva znaky. Další informace naleznete v tématu ALTER DATABASE Compatibility Level (Transact-SQL) a kolace a podporu kódování Unicode.

Pokud hodnota obsahuje 4 bajtový znak Unicode, který je reprezentován dvěma náhradními znaky, SQL Server spočítá náhradní znaky jednotlivě.

string-length() bez parametru lze použít pouze uvnitř predikátu. Například následující dotaz vrátí prvek <ROOT>:

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

Doplňkové znaky (náhradní dvojice)

Chování náhradních párů ve funkcích XQuery závisí na úrovni kompatibility databáze a v některých případech na výchozím identifikátoru URI oboru názvů pro funkce. Další informace najdete v části Funkce XQuery Jsou náhradní funkce v tématu Zásadní změny funkcí databázového stroje v SQL Serveru 2016. Viz také úroveň kompatibility ALTER DATABASE (Transact-SQL) a kolace a podporu kódování Unicode.

Příklady

Toto téma obsahuje příklady XQuery pro instance XML uložené v různých xml sloupce typu v databázi AdventureWorks.

A. Použití funkce XQuery string-length() k načtení produktů s dlouhými souhrnnými popisy

Pro produkty, jejichž souhrnný popis je větší než 50 znaků, následující dotaz načte ID produktu, délku souhrnného popisu a samotný souhrn <Summary> prvek.

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;  

Všimněte si následujících věcí z předchozího dotazu:

  • Podmínka v klauzuli WHERE načte pouze řádky, ve kterých je souhrnný popis uložený v dokumentu XML delší než 200 znaků. Používá metodu value() (datový typ XML).

  • Klauzule SELECT pouze vytvoří požadovaný kód XML. Používá metodu query() (datový typ XML) k vytvoření XML a zadání potřebného výrazu XQuery k načtení dat z dokumentu XML.

Jedná se o částečný výsledek:

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. Použití funkce XQuery string-length() k načtení produktů, jejichž popisy záruk jsou krátké

Pro produkty, jejichž popisy záruk jsou kratší než 20 znaků, následující dotaz načte KÓD XML, který obsahuje ID produktu, délku, popis záruky a samotný prvek <Warranty>.

Záruka je jednou z funkcí produktu. Volitelný podřízený prvek <Warranty> následuje za elementem <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;  

Všimněte si následujících věcí z předchozího dotazu:

  • pd a wm jsou předpony oboru názvů používané v tomto dotazu. Identifikují stejné obory názvů používané v dokumentu, který se dotazuje.

  • XQuery určuje vnořenou smyčku FOR. Vnější smyčka FOR je vyžadována, protože chcete načíst atributy ProductModelID elementu <ProductDescription>. Vnitřní smyčka FOR je povinná, protože chcete jenom produkty, které mají popisy funkcí záruky, které jsou delší než 20 znaků.

Toto je částečný výsledek:

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

Viz také

funkce XQuery proti datového typu XML