CONCAT_WS (Transact-SQL)

Gilt für: SQL Server 2017 (14.x) und höher Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric Warehouse in Microsoft Fabric

Diese Funktion gibt eine Zeichenfolge zurück, die das Ergebnis einer End-to-End-Verkettung oder -Verknüpfung von mindestens zwei Zeichenfolgenwerten darstellt. Sie trennt diese verketteten Zeichenfolgenwerte mit dem im ersten Funktionsargument angegebenen Trennzeichen. (CONCAT_WS gibt die Anweisung concatenate with separator (mit Trennzeichen verketten) an.)

Syntax

CONCAT_WS ( separator , argument1 , argument2 [ , argumentN ] ... )

Argumente

Trennzeichen

Ein Ausdruck eines beliebigen Zeichentyps (char, nchar, nvarchar oder varchar).

argument1, argument2 [ , argumentN ]

Ein Ausdruck eines beliebigen Zeichenfolgenwerts. Die CONCAT_WS-Funktion erfordert mindestens zwei Argumente und lässt nicht mehr als 254 Argumente zu.

Rückgabetypen

Ein Zeichenfolgenwert, dessen Länge und Typ von der Eingabe abhängig sind.

Bemerkungen

CONCAT_WS lässt eine variable Anzahl von Zeichenfolgenargumenten zu und verkettet (oder verknüpft) sie in einer einzelnen Zeichenfolge. Sie trennt diese verketteten Zeichenfolgenwerte mit dem im ersten Funktionsargument angegebenen Trennzeichen. CONCAT_WS erfordert ein Trennzeichen und mindestens zwei weitere Zeichenfolgenwerte als Argumente, andernfalls gibt CONCAT_WS einen Fehler aus. Alle Argumente werden von CONCAT_WS vor der Verkettung implizit in Zeichenfolgentypen konvertiert.

Die implizite Konvertierung in Zeichenfolgen erfolgt basierend auf den vorhandenen Regeln für Datentypkonvertierungen. Weitere Informationen zu Verhaltens- und Datentypkonvertierungen finden Sie unter CONCAT (Transact-SQL).

Behandeln von NULL-Werten

CONCAT_WS ignoriert die SET CONCAT_NULL_YIELDS_NULL { ON | OFF }-Einstellung.

Wenn CONCAT_WS Argumente nur mit NULL-Werten empfängt, wird eine leere Zeichenfolge vom Typ varchar(1) zurückgegeben.

CONCAT_WS ignoriert NULL-Werte bei der Verkettung und fügt keine Trennzeichen zwischen NULL-Werten hinzu. Daher kann CONCAT_WS die Verkettung von Zeichenfolgen, in denen möglicherweise „leere“ Werte auftreten, wie etwa ein zweites Adressfeld, sauber verarbeiten. Weitere Informationen finden Sie unter Beispiel B.

Wenn ein Szenario durch ein Trennzeichen getrennte NULL-Werte beinhaltet, ziehen Sie die ISNULL-Funktion in Erwägung. Weitere Informationen finden Sie unter Beispiel C.

Beispiele

A. Verketten von Werten mit einem Trennzeichen

Dieses Beispiel verkettet drei Spalten der sys.databases-Tabelle, wobei die Werte durch den Bindestrich mit Leerzeichen (-) drum herum voneinander getrennt werden.

SELECT CONCAT_WS(' - ', database_id, recovery_model_desc, containment_desc) AS DatabaseInfo
FROM sys.databases;

Hier sehen Sie das Ergebnis.

DatabaseInfo
-----------------
1 - SIMPLE - NONE
2 - SIMPLE - NONE
3 - FULL - NONE
4 - SIMPLE - NONE

B. Überspringen von NULL-Werten

In diesem Beispiel werden NULL-Werte in der Argumentliste ignoriert und ein Kommatrennwert (,) verwendet.

SELECT CONCAT_WS(',', '1 Microsoft Way', NULL, NULL, 'Redmond', 'WA', 98052) AS Address;

Hier sehen Sie das Ergebnis.

Address
--------------------------------
1 Microsoft Way,Redmond,WA,98052

C. Generieren von CSV-formatierten Daten aus einer Tabelle

Dieses Beispiel verwendet einen Kommatrennwert (,) und fügt ein Wagenrücklaufzeichen CHAR(13) hinzu, sodass ein durch Kommas getrenntes Werteformat im Resultset entsteht.

SELECT STRING_AGG(CONCAT_WS(',', database_id, recovery_model_desc, containment_desc), CHAR(13)) AS DatabaseInfo
FROM sys.databases;

Hier sehen Sie das Ergebnis.

DatabaseInfo
-------------
1,SIMPLE,NONE
2,SIMPLE,NONE
3,FULL,NONE
4,SIMPLE,NONE

CONCAT_WS ignoriert NULL-Werte in den Spalten. Umschließen Sie eine Spalte, die NULL-Werte zulässt, mit der ISNULL-Funktion, und geben Sie einen Standardwert an. Zum Beispiel:

SELECT STRING_AGG(
    CONCAT_WS(',', database_id, ISNULL(recovery_model_desc, ''),
    ISNULL(containment_desc, 'N/A')
    ), CHAR(13)) AS DatabaseInfo
FROM sys.databases;