首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server COALESCE 函數進階實戰:動態 SQL、Pivot 轉置、批次 Kill Session

     編輯:MySQL 資料庫相關知識

COALESCE vs ISNULL 核心差異

特性COALESCEISNULL
參數個數2~無上限固定 2 個
回傳型別依優先級推導 (高精度勝出)第一個參數型別
NULL 屬性結果視為 **NULLABLE**結果視為 **NOT NULL** (若第二參數非 NULL)
標準相容ANSI SQL 標準T-SQL 專有
計算欄持久化需加 `PERSISTED` 才能建索引直接可建索引

進階實戰場景

1. 動態字串拼接 (替代游標/迴圈)


-- 將部門名稱以分號串聯
DECLARE @DeptList VARCHAR(MAX);
SELECT @DeptList = COALESCE(@DeptList + '; ', '') + Name
FROM HumanResources.Department
WHERE GroupName = 'Executive General and Administration';
SELECT @DeptList;  -- 結果: Document Control; Facilities; ...

2. 動態建構多條 SQL 陳述式 (批次執行)


-- 查詢 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;

3. 批次 Kill 佔用資料庫的 Session (解決無法獨佔還原)


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);

4. 計算欄持久化並建索引 (解決 NULLABLE 問題)


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

常見陷阱

  • 所有參數皆為 NULL → 錯誤:`At least one of the arguments to COALESCE must be a non-null constant` → 確保至少一個非 NULL 常數
  • 資料型別優先級導致隱含轉換溢位 → 显式 `CAST` 統一型別
  • 動態 SQL 注入風險 → 善用 `QUOTENAME`、參數化 `sp_executesql`

效能提示

  • 字串拼接在大量列 (10萬+) 時,`COALESCE` 變數法較 `FOR XML PATH` 快,但 SQL 2017+ `STRING_AGG` 最優
  • 動態 SQL 批次執行減少網路往返,適合維護腳本、Schema 變更部署

COALESCE 不只是「取第一個非 NULL」,其**多參數、NULLABLE 語意、動態拼接**特性,使其成為 T-SQL 進階開發的瑞士刀。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved