concat-Funktion (XQuery)
Nimmt null oder mehr Zeichenfolgen als Argumente an und gibt eine Zeichenfolge zurück, die durch Verketten der Werte der einzelnen Argumente erstellt wird.
Syntax
fn:concat ($string as xs:string?
,$string as xs:string?
[, ...]) as xs:string
Argumente
- $string
Optionale zu verkettende Zeichenfolge.
Hinweise
Die Funktion erfordert mindestens zwei Argumente. Wenn ein Argument eine leere Sequenz ist, wird diese als eine Zeichenfolge mit der Länge Null behandelt.
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 ersatzzeichenabhängig" im Thema Fehlerhafte Änderungen an Funktionen des Datenbankmoduls in SQL Server 2012. Siehe auch ALTER DATABASE-Kompatibilitätsgrad (Transact-SQL) und Sortierung und Unicode-Unterstützung.
Beispiele
Dieses Thema stellt XQuery-Beispiele für XML-Instanzen bereit, die in verschiedenen Spalten vom xml-Datentyp in der AdventureWorks-Beispieldatenbank gespeichert sind.
A.Verwenden der XQuery-Funktion concat() zum Verketten von Zeichenfolgen
Diese Abfrage gibt für ein bestimmtes Produktmodell eine Zeichenfolge zurück, die durch Verketten des Garantiezeitraumes und der Garantiebeschreibung erstellt wird. Im Katalogbeschreibungsdokument besteht das <Warranty>-Element aus untergeordneten Elementen von <WarrantyPeriod> und <Description>.
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('
<Product
ProductModelID= "{ (/pd:ProductDescription/@ProductModelID)[1] }"
ProductModelName = "{ sql:column("PD.Name") }" >
{
concat( string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:WarrantyPeriod)[1]), "-",
string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:Description)[1]))
}
</Product>
') as Result
FROM Production.ProductModel PD
WHERE PD.ProductModelID=28
Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:
In der SELECT-Klausel ist CatalogDescription eine Spalte vom Typ xml. Daher wird die query()-Methode (XML-Datentyp) Instructions.query() verwendet. Die XQuery-Anweisung wird als Argument der query-Methode angegeben.
Das Dokument, für das die Abfrage ausgeführt wird, verwendet Namespaces. Daher wird das namespace-Schlüsselwort zum Definieren des Präfixes für den Namespace verwendet. Weitere Informationen finden Sie unter XQuery-Prolog.
Dies ist das Ergebnis:
<Product ProductModelID="28" ProductModelName="Road-450">1 year-parts and labor</Product>
Die vorherige Abfrage ruft Informationen für ein bestimmtes Produkt ab. Die folgende Abfrage ruft die gleichen Informationen für alle Produkte ab, für die XML-Katalogbeschreibungen gespeichert sind. Die exist()-Methode des XML-Datentyps in der WHERE-Klausel gibt True zurück, wenn das XML-Dokument in den Zeilen über ein <ProductDescription>-Element verfügt.
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('
<Product
ProductModelID= "{ (/pd:ProductDescription/@ProductModelID)[1] }"
ProductName = "{ sql:column("PD.Name") }" >
{
concat( string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:WarrantyPeriod)[1]), "-",
string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:Description)[1]))
}
</Product>
') as Result
FROM Production.ProductModel PD
WHERE CatalogDescription.exist('//pd:ProductDescription ') = 1
Beachten Sie, dass der von der exist()-Methode des xml-Datentyps zurückgegebene boolesche Wert mit 1 verglichen wird.
Implementierungseinschränkungen
Die folgenden Einschränkungen sind zu beachten:
- Die concat()-Funktion in SQL Server nimmt nur Werte des Typs xs:string an. Andere Werte müssen explizit in xs:string oder xdt:untypedAtomic umgewandelt werden.