需求:在預存程序中動態建立暫存表,表名包含呼叫端主機名稱(HOST_NAME()),結構固定。
DECLARE @TableName CHAR(50)
SELECT @TableName = '#temp_' + HOST_NAME()
CREATE TABLE [dbo].[@TableName] (...) -- 語法錯誤:無法使用變數作為物件名稱
SQL Server 不支援 直接以變數指定 DDL 物件名稱(CREATE TABLE、CREATE INDEX 等)。
DECLARE @name VARCHAR(100)
SELECT @name = '#temp_' + REPLACE(HOST_NAME(), '-', '') -- 移除主機名中可能的非法字元
EXEC ('CREATE TABLE ' + @name + ' (id INT, col VARCHAR(200))')
EXEC (@sql_string) 或 sp_executesql @sql_string 可執行動態建構的 T-SQL 字串。# 開頭,建立於 tempdb,工作階段結束自動清理。REPLACE(HOST_NAME(), '-', '') 防止主機名含連字號導致識別碼無效。sp_executesql 並傳遞參數定義,避免 SQL 注入與計畫重用問題。DECLARE @sql NVARCHAR(MAX), @tbl SYSNAME
SET @tbl = '#temp_' + REPLACE(HOST_NAME(), '-', '')
SET @sql = N'CREATE TABLE ' + QUOTENAME(@tbl) + N' (id INT, col VARCHAR(200)); SELECT @out = ''' + @tbl + N''''
EXEC sp_executesql @sql, N'@out SYSNAME OUTPUT', @tbl OUTPUT
-- 後續可使用 @tbl 變數操作該暫存表
動態 DDL 必須透過動態 SQL 執行。善用 QUOTENAME 防注入、sp_executesql 參數化與計畫重用,是企業級動態 SQL 的標準作法。