Funktionen für Zeichenfolgenwerte – string-length
Gilt für:SQL Server
Gibt die Länge der Zeichenfolge in Zeichen zurück.
Syntax
fn:string-length() as xs:integer
fn:string-length($arg as xs:string?) as xs:integer
Argumente
$arg
Quellzeichenfolge, deren Länge berechnet werden soll.
Bemerkungen
Wenn der Wert von $arg eine leere Sequenz ist, wird ein xs:integer-Wert von 0 zurückgegeben.
Das Verhalten von Ersatzpaaren in XQuery-Funktionen hängt vom Kompatibilitätsgrad der Datenbank ab. Beim Kompatibilitätsgrad 110 oder höher wird jedes Ersatzpaar als einzelnes Zeichen gezählt. Bei niedrigeren Kompatibilitätsgraden werden Ersatzpaare als zwei Zeichen betrachtet. Weitere Informationen finden Sie unter ALTER DATABASE Compatibility Level (Transact-SQL) und Sortierungs- und Unicode-Unterstützung.
Wenn der Wert ein 4-Byte-Unicode-Zeichen enthält, das durch zwei Ersatzzeichen dargestellt wird, zählen SQL Server die Ersatzzeichen einzeln.
Die Zeichenfolgenlänge() ohne Parameter kann nur innerhalb eines Prädikats verwendet werden. Beispielsweise gibt die folgende Abfrage das <ROOT
> -Element zurück:
DECLARE @x xml;
SET @x='<ROOT>Hello</ROOT>';
SELECT @x.query('/ROOT[string-length()=5]');
Ergänzende Zeichen (Ersatzpaare)
Das Verhalten von Ersatzzeichenpaaren in XQuery-Funktionen hängt vom Kompatibilitätsgrad der Datenbank ab und in einigen Fällen vom Standardnamespace-URI für Funktionen. Weitere Informationen finden Sie im Abschnitt "XQuery-Funktionen sind ersatzfähig" im Thema Breaking Changes to Database Engine Features in SQL Server 2016. Weitere Informationen finden Sie unter ALTER DATABASE Compatibility Level (Transact-SQL) und Sortierung und Unicode-Unterstützung.
Beispiele
In diesem Thema finden Sie XQuery-Beispiele für XML-Instanzen, die in verschiedenen Spalten des XML-Typs in der AdventureWorks-Datenbank gespeichert sind.
A. Verwenden der string-length()-Funktion von XQuery zum Abrufen von Produkten mit langen Zusammenfassungsbeschreibungen
Für Produkte, deren Zusammenfassungsbeschreibung größer als 50 Zeichen ist, ruft die folgende Abfrage die Produkt-ID, die Länge der Zusammenfassungsbeschreibung und die Zusammenfassung selbst, das <Summary
> Element ab.
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;
Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:
Die Bedingung in der WHERE-Klausel ruft nur die Zeilen ab, für die die im XML-Dokument gespeicherte Zusammenfassung länger als 200 Zeichen ist. Sie verwendet die value()-Methode (XML-Datentyp).
Die SELECT-Klausel erstellt nur das von Ihnen gewünschte XML. Es verwendet die query()-Methode (XML-Datentyp), um den XML-Code zu erstellen und den erforderlichen XQuery-Ausdruck anzugeben, um Daten aus dem XML-Dokument abzurufen.
Dies ist ein Teilergebnis:
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. Verwenden der string-length()-Funktion von XQuery zum Abrufen von Produkten, deren Garantiebeschreibungen kurz sind
Für Produkte, deren Garantiebeschreibungen weniger als 20 Zeichen lang sind, ruft die folgende Abfrage XML ab, die die Produkt-ID, die Länge, die Garantiebeschreibung und das <Warranty
> Element selbst enthält.
Die Garantie ist eine der Produktfunktionen. Nach dem -Element folgt ein optionales <Warranty
> untergeordnetes <Features
> Element.
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;
Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:
pd und wm sind die Namespacepräfixe, die in dieser Abfrage verwendet werden. Sie geben den gleichen Namespace an, der in dem Dokument verwendet wird, das abgefragt wird.
Die XQuery gibt eine geschachtelte FOR-Schleife an. Die äußere FOR-Schleife ist erforderlich, da Sie die ProductModelID-Attribute des <
ProductDescription
> Elements abrufen möchten. Die innere FOR-Schleife ist erforderlich, weil Sie nur die Produkte abrufen möchten, die Garantiefunktionsbeschreibungen besitzen, die kürzer als 20 Zeichen sind.
Dies ist das Teilergebnis:
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>
...