首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 動態建立資料表:以主機名稱作為暫存表名稱的正確寫法

     編輯:關於SqlServer

需求:在預存程序中動態建立暫存表,表名包含呼叫端主機名稱(HOST_NAME()),結構固定。

錯誤嘗試

DECLARE @TableName CHAR(50)
SELECT @TableName = '#temp_' + HOST_NAME()
CREATE TABLE [dbo].[@TableName] (...)  -- 語法錯誤:無法使用變數作為物件名稱

SQL Server 不支援 直接以變數指定 DDL 物件名稱(CREATE TABLE、CREATE INDEX 等)。

正確解法:動態 SQL (EXEC / sp_executesql)

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 的標準作法。

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