CONCAT_WS (Transact-SQL)

Область применения: SQL Server 2017 (14.x) и более поздних версий База данных SQL Azure Управляемый экземпляр SQL Azure Конечная точка аналитики Synapse Analytics Synapse Analyticsв хранилище Microsoft Fabricв Microsoft Fabric

Эта функция возвращает строку, возникающую в результате объединения двух или более строковых значений в сквозной форме. Она разделяет значения в такой объединенной строке с помощью разделителя, указанного в первом аргументе функции. (Название функции CONCAT_WS означает сцепить с разделителем.)

Синтаксис

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

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

separator

Выражение любого типа символа (char, nchar, nvarchar или varchar).

argument1, argument2 [ , argumentN ]

Выражение любого строкового значения. Функции CONCAT_WS требуется по крайней мере два аргумента и не более 254 аргументов.

Типы возвращаемых данных

Строковое значение, длина и тип которого зависят от входных данных.

Замечания

CONCAT_WS принимает переменное количество строковых аргументов и объединяет их в одну строку. Она разделяет значения в такой объединенной строке с помощью разделителя, указанного в первом аргументе функции. CONCAT_WS требует аргумента разделителя и не менее двух других аргументов строкового значения; CONCAT_WS в противном случае вызывает ошибку. Функция CONCAT_WS неявно преобразует все аргументы в строковые типы перед объединением.

Неявное преобразование в строки выполняется по существующим правилам преобразования типов данных. Дополнительные сведения о преобразовании типов данных см. в статье CONCAT (Transact-SQL).

Обработка значений NULL

CONCAT_WS игнорирует параметр SET CONCAT_NULL_YIELDS_NULL { ON | OFF }.

При CONCAT_WS получении аргументов со всеми NULL значениями возвращается пустая строка типа varchar(1).

CONCAT_WS игнорирует значения NULL во время объединения и не добавляет разделитель между значениями NULL. Таким образом CONCAT_WS позволяет точно объединить строки, которые могут иметь пустые значения, например второе поле адреса. Дополнительные сведения см . в примере B.

Если сценарий включает значения NULL, разделенные разделителем, рассмотрите функцию ISNULL . Дополнительные сведения см. в примере C.

Примеры

А. Объединение значений с разделителем

В этом примере объединяются три столбца из sys.databases таблицы, разделяя значения дефисом, окруженным пробелами (-).

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

Результирующий набор:

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

B. Пропуск значений NULL

Этот пример игнорирует NULL значения в списке аргументов и использует значение разделителя запятых (,).

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

Результирующий набор:

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

C. Создание данных в формате CSV из таблицы

В этом примере используется значение разделителя-запятые (,), а возвращаемый символ CHAR(13) каретки добавляется в формат разделенных столбцом значений результирующий набор.

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

Результирующий набор:

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

CONCAT_WS игнорирует NULL значения в столбцах. Перенесите столбец, допускающий значения NULL, с помощью функции ISNULL и укажите значение по умолчанию. Например:

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