在動態 SQL、預存程序開發中,常需檢查臨時表 (#TempTable) 的結構。本文提供兩個實用查詢:列出所有欄位、判斷特定欄位是否存在。
SELECT name
FROM tempdb.dbo.syscolumns
WHERE id = OBJECT_ID('tempdb..#TempTB');
tempdb.dbo.syscolumns:系統基底表,記錄所有資料表/臨時表欄位中繼資料。OBJECT_ID('tempdb..#TempTB'):取得臨時表物件 ID (需在同一 Session/連線中)。name 即為欄位名稱清單。IF COL_LENGTH('tempdb.dbo.#TempTB', 'columnName') IS NOT NULL
PRINT '存在'
ELSE
PRINT '不存在';
COL_LENGTH(db_table, column):回傳欄位定義長度 (bytes);若欄位不存在回傳 NULL。'tempdb.dbo.#TempTB' (含 schema)、'columnName' (欄位名)。IF 條件控制流程、動態 ALTER TABLE ADD/DROP COLUMN。| 表類型 | OBJECT_ID 參數 | COL_LENGTH 參數 |
|---|---|---|
| 區域臨時表 (#Table) | OBJECT_ID('tempdb..#Table') | COL_LENGTH('tempdb.dbo.#Table', 'col') |
| 全域臨時表 (##Table) | OBJECT_ID('tempdb..##Table') | COL_LENGTH('tempdb.dbo.##Table', 'col') |
| 永久表 (dbo.Table) | OBJECT_ID('dbo.Table') | COL_LENGTH('dbo.Table', 'col') |
-- 列出所有欄位
SELECT COLUMN_NAME
FROM tempdb.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '#TempTB' AND TABLE_SCHEMA = 'dbo';
-- 判斷欄位存在
IF EXISTS (
SELECT 1
FROM tempdb.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '#TempTB' AND COLUMN_NAME = 'columnName'
)
PRINT '存在';
INFORMATION_SCHEMA 中可見性視權限/版本而定,syscolumns/COL_LENGTH 在 SQL Server 更可靠。IF COL_LENGTH('tempdb.dbo.#Staging', 'NewColumn') IS NULL
BEGIN
ALTER TABLE #Staging ADD NewColumn VARCHAR(100) NULL;
PRINT '已新增 NewColumn';
END
ELSE
PRINT 'NewColumn 已存在';
掌握 syscolumns 與 COL_LENGTH,能在 SQL Server 動態 SQL 中安全操作臨時表結構。