| 特性 | COALESCE | ISNULL |
|---|---|---|
| 參數個數 | 2~無上限 | 固定 2 個 |
| 回傳型別 | 依優先級推導 (高精度勝出) | 第一個參數型別 |
| NULL 屬性 | 結果視為 **NULLABLE** | 結果視為 **NOT NULL** (若第二參數非 NULL) |
| 標準相容 | ANSI SQL 標準 | T-SQL 專有 |
| 計算欄持久化 | 需加 `PERSISTED` 才能建索引 | 直接可建索引 |
-- 將部門名稱以分號串聯
DECLARE @DeptList VARCHAR(MAX);
SELECT @DeptList = COALESCE(@DeptList + '; ', '') + Name
FROM HumanResources.Department
WHERE GroupName = 'Executive General and Administration';
SELECT @DeptList; -- 結果: Document Control; Facilities; ...
-- 查詢 Person 結構下所有含 Name 欄位的表,插入暫存表
DECLARE @SQL VARCHAR(MAX);
CREATE TABLE #Tmp (ColName VARCHAR(500), Val VARCHAR(50));
SELECT @SQL = COALESCE(@SQL, '') +
'INSERT INTO #Tmp SELECT ''' + TABLE_SCHEMA + '.' + TABLE_NAME + '.' + COLUMN_NAME + ''', Name FROM ' +
QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + ';'
FROM INFORMATION_SCHEMA.COLUMNS c
JOIN sys.objects o ON c.TABLE_NAME = o.name
WHERE c.COLUMN_NAME = 'Name' AND o.type = 'U' AND c.TABLE_SCHEMA = 'Person';
EXEC(@SQL);
SELECT * FROM #Tmp;
DROP TABLE #Tmp;
DECLARE @KillCmd VARCHAR(MAX);
SELECT @KillCmd = COALESCE(@KillCmd, '') + 'KILL ' + CAST(spid AS VARCHAR) + '; '
FROM sys.sysprocesses
WHERE dbid = DB_ID('AdventureWorks');
PRINT @KillCmd; -- 確認後執行
-- EXEC(@KillCmd);
CREATE TABLE #CheckSumTest (
ID INT IDENTITY,
Num INT DEFAULT (RAND() * 100),
RowCheckSum AS COALESCE(CHECKSUM(ID, Num), 0) PERSISTED PRIMARY KEY
);
-- PERSISTED 使計算欄實體化,COALESCE 確保非 NULL,可建 PRIMARY KEY
COALESCE 不只是「取第一個非 NULL」,其**多參數、NULLABLE 語意、動態拼接**特性,使其成為 T-SQL 進階開發的瑞士刀。