CONCAT_WS (Transact-SQL)

S’applique à : SQL Server 2017 (14.x) et versions ultérieures Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPoint de terminaison analytique SQL dans Microsoft FabricEntrepôt dans Microsoft Fabric

Cette fonction retourne une chaîne qui résulte de la concaténation ou de la jointure de deux valeurs de chaîne ou plus, de bout en bout. Elle sépare ces valeurs de chaîne concaténées avec le délimiteur spécifié dans le premier argument de la fonction. (CONCAT_WS indique concaténer avec un séparateur.)

Syntaxe

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

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez Versions antérieures de la documentation.

Arguments

separator

Une expression de n’importe quel type de caractère (CAR, nchar, nvarchar, or varchar).

argument1, argument2 [ , argumentN ]

Une expression de n’importe quelle valeur de chaîne. La fonction CONCAT_WS nécessite au moins deux arguments et pas plus de 254 arguments.

Types de retour

Valeur de chaîne dont la longueur et le type dépendent de l’entrée.

Notes

CONCAT_WS accepte un nombre variable d’arguments de chaîne et les concatène (ou les joint) en une seule chaîne. Elle sépare ces valeurs de chaîne concaténées avec le délimiteur spécifié dans le premier argument de la fonction. CONCAT_WS nécessite un argument de séparateur et un minimum de deux autres arguments de valeur de chaîne ; sinon, CONCAT_WS génère une erreur. CONCAT_WS convertit implicitement tous les arguments en types chaîne avant la concaténation.

La conversion implicite en chaînes respecte les règles existantes de conversion de type de données. Pour plus d’informations sur le comportement et les conversions de type de données, consultez CONCAT (Transact-SQL).

Traitement des valeurs NULL

CONCAT_WS ignore le paramètre SET CONCAT_NULL_YIELDS_NULL { ON | OFF }.

Si CONCAT_WS reçoit des arguments dont toutes les valeurs NULL, elle retourne une chaîne vide de type varchar(1).

CONCAT_WS ignore les valeurs NULL durant la concaténation et n’ajoute pas le séparateur entre les valeurs NULL. Par conséquent, CONCAT_WS peut gérer correctement la concaténation des chaînes avec des valeurs « vides », par exemple, un deuxième champ d’adresse. Consultez l’exemple B pour plus d’informations.

Si un scénario implique des valeurs NULL séparées par un délimiteur, considérez la fonction ISNULL. Pour plus d’informations, consultez l’exemple C.

Exemples

R. Concaténez des valeurs avec séparateur

Cet exemple concatène trois colonnes de la table sys.databases, en séparant les valeurs par un trait d’union entouré d’espaces (-).

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

Voici le jeu de résultats obtenu.

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

B. Ignorez les valeurs NULL

Cet exemple ignore les valeurs NULL de la liste des arguments et utilise une valeur de séparateur de virgules (,).

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

Voici le jeu de résultats obtenu.

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

C. Générez des données au format CSV à partir d’une table

Cet exemple utilise une valeur de séparateur de virgule (,) et ajoute le caractère de retour chariot CHAR(13) dans le format de valeurs séparées par des colonnes du jeu de résultats.

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

Voici le jeu de résultats obtenu.

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

CONCAT_WS ignore les valeurs NULL dans les colonnes. Agencez une colonne de valeurs NULL avec la fonction ISNULL et fournissez une valeur par défaut. Par exemple :

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