動態建立資料表
DECLARE @TableName NVARCHAR(128) = N'T_UserUid'; -- 表名變數
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N'
CREATE TABLE [dbo].[' + QUOTENAME(@TableName) + N'](
[Cid] [int] IDENTITY(1,1) NOT NULL,
[Uid] [nchar](32) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_' + @TableName + N'] PRIMARY KEY CLUSTERED ([Cid] ASC)
WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]';
EXEC sp_executesql @SQL;
為指定欄位加入唯一索引
DECLARE @IndexSQL NVARCHAR(MAX);
SET @IndexSQL = N'CREATE UNIQUE INDEX IX_' + @TableName + N'_Uid ON ' + QUOTENAME(@TableName) + N' (Uid)';
EXEC sp_executesql @IndexSQL;
語法解析
| 語法元素 | 說明 |
QUOTENAME()自動加入方括號,防止 SQL 注入與特殊字元錯誤 |
sp_executesql參數化執行動態 SQL,優於 EXEC(),支援計畫重用 |
CREATE UNIQUE INDEX建立唯一非叢集索引,強制欄位值唯一(允許單一 NULL) |
擴充應用:批次建立多張相同結構資料表
DECLARE @Prefix NVARCHAR(50) = N'T_User_';
DECLARE @Suffixes TABLE (Suffix NVARCHAR(20));
INSERT INTO @Suffixes VALUES ('UID'), ('EMAIL'), ('PHONE');
DECLARE @Sql NVARCHAR(MAX) = N'';
SELECT @Sql += N'
CREATE TABLE [dbo].[' + QUOTENAME(@Prefix + Suffix) + N'](
[Cid] [int] IDENTITY(1,1) NOT NULL,
[Value] [nchar](32) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_' + @Prefix + Suffix + N'] PRIMARY KEY CLUSTERED ([Cid] ASC)
) ON [PRIMARY];
CREATE UNIQUE INDEX [IX_' + @Prefix + Suffix + N'_Value] ON [dbo].[' + QUOTENAME(@Prefix + Suffix) + N'] ([Value]);
'
FROM @Suffixes;
EXEC sp_executesql @Sql;
注意事項
- 動態 SQL 需具備
CREATE TABLE、CREATE INDEX 權限
- 叢集索引鍵預設為主鍵,若查詢模式不同可調整
- 唯一索引建立前確認現有資料無重複值,否則會失敗
- 生產環境建議透過變更管理流程執行,並先在測試環境驗證