Aracılığıyla paylaş


dize uzunluğu işlev (XQuery)

Dize uzunluğunu karakter döndürür.

Sözdizimi

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

Bağımsız değişkenler

  • $arg
    Kaynak dize uzunluğunu hesaplanması etmektir.

Açıklamalar

Eğer değeri $argboş bir sıra ise bir XS 0 değeri döndürülür.

Vekil çiftleri XQuery işlevleri davranışını veritabanı uyumluluk düzeyine bağlıdır. Uyumluluk düzeyi 110 veya daha sonra her yedek çifti tek bir karakter olarak sayılır. Önceki Uyumluluk düzeyleri için onlar iki karakter olarak sayılır. Daha fazla bilgi için alter database uyumluluk düzeyi (Transact-sql)ve Supplementary Characters.

İki vekil karakterler tarafından temsil edilen 4 baytlık Unicode karakter değerini içeriyorsa, SQL Servervekil karakterleri tek tek sayılır.

String-length() olmadan bir parametre yalnızca bir yüklemi içinde kullanılabilir. Örneğin, aşağıdaki sorgu döndürür <ROOT> öğesi:

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

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

İkincil Karakterler (Yedek Çiftler)

Veritabanı uyumluluk düzeyi ve bazı durumlarda, varsayılan ad alanı URI işlevleri için vekil çiftleri XQuery işlevleri davranışını bağlıdır. Daha fazla bilgi için bkz: "XQuery işlevleri olan vekil tanımayan" bölümü konudaki En son değişiklikleri SQL Server 2012 veritabanı altyapısı özellikleri. Also see alter database uyumluluk düzeyi (Transact-sql) and Supplementary Characters.

Örnekler

Bu konu çeşitli depolanan xml örnekleri karşı XQuery örnekler sağlar xml yazın sütunlarında AdventureWorksveritabanı. Bu sütunlar genel bakış için bkz: DEL - xml Data Type Representation in the AdventureWorks2008R2 Database.

A.Uzun Özet açıklamaları ürünleriyle almak için string-length() XQuery işlevini kullanma

Özet açıklaması 50 karakterden daha büyük ürünler için ürün kimliği, uzunluğu Özet açıklaması ve özeti, aşağıdaki sorgu alır <Summary> öğesi.

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;

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 yan tümcesi yalnızca Özet açıklaması xml belgesinde bulunduğu satırları alır içinde 200 karakterden fazla durumdur. O uses value() yöntemi (xml veri türü).

  • select yan tümcesi yalnızca istediğiniz xml oluşturur. O uses query() yöntemi (xml veri türü) xml oluşturmak ve xml belgesinden veri almak için gerekli XQuery ifade belirtin.

Bu kısmi bir sonucudur:

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

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.Ürünler, garanti açıklamaları kısa almak için string-length() XQuery işlevini kullanma

Garanti açıklamaları daha az 20 karakterden uzun olan ürünler için ürün kimliği, uzunluğu, garanti açıklama içeren xml aşağıdaki sorgu alır ve <Warranty> öğesinin kendisi.

Garanti, ürünün özelliklerinden biridir. İsteğe <Warranty> sonra aşağıdaki alt öğesi <Features> öğesi.

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;

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 olan bu sorguda kullanılan ad alanı önekleri. Onlar sorgulanan belgede kullanılan aynı ad alanlarını tanımlama.

  • XQuery iç içe bir döngü için belirtir. Almak istediğiniz dış döngü gerekir, çünkü ProductModelID niteliklerini <ProductDescription> öğesi. Çünkü sadece az 20 karakterden uzun garanti özellik açıklamaları olan ürünler istediğiniz iç döngü için gereklidir.

Bu kısmi bir sonucudur:

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

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

Ayrıca bkz.

Başvuru

Xml veri türü karşı XQuery işlevleri