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.
Hinweise
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 Sortierung und Unicode-Unterstützung.
Wenn der Wert ein 4-Byte-Unicode-Zeichen enthält, das durch zwei Ersatzzeichen dargestellt wird, zählt SQL Server die Ersatzzeichen einzeln.
Die Zeichenfolgenlänge() ohne Parameter kann nur innerhalb eines Prädikats verwendet werden. Die folgende Abfrage gibt beispielsweise 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 Functions Are Surrogate-Aware" im Thema Breaking Changes to Datenbank-Engine Features in SQL Server 2016. Siehe auch ALTER DATABASE Compatibility Level (Transact-SQL) und Sortierung und Unicode-Unterstützung.
Beispiele
Dieses Thema enthält XQuery-Beispiele für XML-Instanzen, die in verschiedenen XML-Typspalten in der AdventureWorks-Datenbank gespeichert sind.
A. Verwenden der string-length()-Funktion von XQuery zum Abrufen von Produkten mit langen Zusammenfassungsbeschreibungen
Bei Produkten, deren Zusammenfassungsbeschreibung größer als 50 Zeichen ist, ruft die folgende Abfrage die Produkt-ID, die Länge der Zusammenfassungsbeschreibung und die Zusammenfassung selbst ab, das <Summary
> Element.
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. Sie 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
Bei Produkten, deren Garantiebeschreibungen weniger als 20 Zeichen lang sind, ruft die folgende Abfrage XML-Daten ab, die die Produkt-ID, Länge, Garantiebeschreibung und das <Warranty
> Element selbst enthalten.
Die Garantie ist eine der Produktfunktionen. Ein optionales <Warranty
> untergeordnetes Element folgt nach dem <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>
...
Weitere Informationen
XQuery Functions against the xml Data Type (XQuery-Funktionen für den xml-Datentyp)