在 SQL Server 2012 之前,字串串聯只能使用 + 運算子,但這帶來一個經典陷阱:任一運算元為 NULL,整個結果即為 NULL。開發人員不得不寫大量 ISNULL 或 COALESCE 來處理,程式碼既冗長又易漏錯。
/* 不含 NULL 時正常 */
DECLARE @t1 varchar(10) = 'a', @t2 varchar(10) = 'b', @t3 varchar(10) = 'c', @t4 varchar(10) = 'd', @N1 int = 2012;
SELECT @t1 + @t2 + @t3 + @t4 + CONVERT(varchar(10), @N1) AS result; -- 'abcd2012'
/* 含 NULL 時全變 NULL */
DECLARE @t3 varchar(10) = NULL;
SELECT @t1 + @t2 + @t3 + @t4 + CONVERT(varchar(10), @N1) AS result; -- NULL
/* 必須逐一包 ISNULL */
SELECT @t1 + @t2 + ISNULL(@t3, '') + @t4 + CONVERT(varchar(10), @N1) AS result; -- 'abd2012'
SQL Server 2012 引入 CONCAT,自動將 NULL 視為空字串,並支援任意數量參數、自動處理資料型別轉換:
/* 直接串聯字面值 */
SELECT CONCAT('a','b','c','d','2012') AS result; -- 'abcd2012'
/* 變數串聯,含 NULL 也不會變 NULL */
DECLARE @t1 varchar(10) = 'a', @t2 varchar(10) = 'b', @t3 varchar(10) = NULL, @t4 varchar(10) = 'd', @N1 int = 2012;
SELECT CONCAT(@t1, @t2, @t3, @t4, @N1) AS result; -- 'abd2012'
CONCAT 內部優化過,通常比多重 + + ISNULL 更快。NVARCHAR(MAX) 或 VARCHAR(MAX),超長字串也能安全處理。CONCAT,減少 NULL 相關 Bug。ISNULL(col, '') 模式替換為 CONCAT。+ 配合 CASE 處理。