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.
Beispiele
Diese Thema stellt XQuery-Beispiele für XML-Instanzen bereit, die in verschiedenen Spalten des xml-Typs in der AdventureWorks-Beispieldatenbank gespeichert werden. Einen Überblick über diese Spalten finden Sie unter Darstellung des xml-Datentyps in der AdventureWorks-Datenbank.
A. Verwenden der concat()-Funktion von XQuery 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 den untergeordneten <WarrantyPeriod>- und <Description>-Elementen.
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 ein <ProductDescription>-Element in den Zeilen enthält.
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.