Dize Değerlerindeki İşlevler - dize uzunluğu

Şunlar için geçerlidir: SQL Server

Dizinin uzunluğunu karakter olarak döndürür.

Syntax

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

Arguments

$arg
Uzunluğu hesaplanacak kaynak dizisi.

Remarks

Eğer $arg'nin değeri boş bir diziye ise, 0'ın xs:tam sayı değeri döner.

XQuery fonksiyonlarındaki vekil çiftlerin davranışı, veritabanı uyumluluk seviyesine bağlıdır. Uyumluluk seviyesi 110 veya daha üzerindeyse, her vekil çift tek bir karakter olarak sayılır. Daha erken uyumluluk seviyeleri için iki karakter olarak sayılırlar. Daha fazla bilgi için Uyumluluk Seviyesi (Transact-SQL) ve Koleksiyon ve Unicode Desteği bölümlerine bakınızALTER DATABASE.

Değer iki vekil karakterle temsil edilen 4 baytlık bir Unicode karakteri içeriyorsa, SQL Server vekil karakterleri tek tek sayar.

Parametresi olmayan dizis-length() yalnızca bir önlem içinde kullanılabilir. Örneğin, aşağıdaki sorgu elemanı <ROOT> döndürür:

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

Ek Karakterler (Vekil Çiftler)

XQuery fonksiyonlarındaki vekil çiftlerin davranışı, veritabanı uyumluluk seviyesine ve bazı durumlarda fonksiyonlar için varsayılan isim alanı URI'sine bağlıdır. Daha fazla bilgi için Uyumluluk Seviyesi (Transact-SQL) ve Koleksiyon ve Unicode Desteği bölümlerine bakınızALTER DATABASE.

Examples

Bu konu, AdventureWorks veritabanındaki çeşitli xml tipi sütunlarda depolanan XML örneklerine karşı XQuery örnekleri sunmaktadır.

A. Uzun özet açıklamalara sahip ürünleri almak için string-length() XQuery fonksiyonunu kullanmak

Özet açıklaması 50 karakterden büyük olan ürünler için, aşağıdaki sorgu ürün kimliğini, özet açıklamasının uzunluğunu ve özetin kendisini, <Summary> yani elemanı alır.

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;  

Önceki sorgudan aşağıdakilere dikkat edin:

  • WHERE maddesindeki koşul, yalnızca XML belgesinde depolanan özet açıklamasının 200 karakterden uzun olduğu satırları alır. Value() yöntemini (XML veri türü) kullanır.

  • SELECT maddesi sadece istediğiniz XML'i oluşturur. XML'i oluşturmak ve XML belgesinden veri almak için gerekli XQuery ifadesini belirtmek için query() yöntemini (XML veri türü) kullanır.

Bu kısmi bir sonuçdur:

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. Garanti açıklamaları kısa olan ürünleri almak için string-length() XQuery fonksiyonunu kullanarak

Garanti açıklamaları 20 karakterden az olan ürünler için, aşağıdaki sorgu ürün kimliği, uzunluğu, garanti açıklaması ve öğenin <Warranty> kendisini içeren XML dosyasını alır.

Garanti, ürün özelliklerinden biridir. Elementten<Warranty> sonra isteğe bağlı <Features> bir çocuk eleman gelir.

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;  

Önceki sorgudan aşağıdakilere dikkat edin:

  • PD ve WM bu sorguda kullanılan isim alanı önekleridir. Sorgulanan belgede kullanılan aynı isim alanlarını tanımlar.

  • XQuery, iç içe FOR döngüsü belirler. Dış FOR döngüsü gereklidir, çünkü elemanın ProductModelID özniteliklerini <ProductDescription> almak istersiniz. Dahili FOR döngüsü gereklidir, çünkü sadece garanti özellikleri 20 karakterden kısa olan ürünleri tercih edersiniz.

Kısmi sonuç şu şekildedir:

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