CONCAT_WS (Transact-SQL)

適用于: Microsoft Fabric 中 Microsoft Fabric 倉儲中的 SQL Server 2017 (14.x) 和更新版本 Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics SQL 分析端點

此函式會傳回透過以端對端方式串連 (或聯結) 兩個以上字串值所產生的字串。 它使用第一個函數引數中指定的分隔符號來分隔這些串連的字串值。 (CONCAT_WS 指出 與分隔符號的串連。)

Syntax

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

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

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 範例。

範例

A. 使用分隔符號串連值

此範例會串連資料表中的 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 行中的值。 使用 ISNULL 函數來包裝可為 Null 的資料行,並提供預設值。 例如:

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