需將 TableA.欄位1、TableB.欄位2、TableC.欄位3 合併建立 Table4,**僅複製結構,不含資料**。
SELECT a.欄位1, b.欄位2, c.欄位3
INTO Table4
FROM TableA a, TableB b, TableC c
WHERE 1 = 0; -- 條件永假,不產生資料列,僅複製結構
-- 1. 建立暫存表包含目標結構 + 新欄位
SELECT *
INTO Table5
FROM Table4 t
LEFT JOIN (
SELECT a.欄位1, b.欄位2, c.欄位3
FROM TableA a, TableB b, TableC c
WHERE 1 <> 1 -- 同樣不產生資料
) n ON 1 = 1; -- 永真條件,產生笛卡兒積但無資料列
-- 2. 刪除舊表
DROP TABLE Table4;
-- 3. 重命名暫存表
EXEC sp_rename 'Table5', 'Table4';
-- 動態建構 ALTER TABLE ADD COLUMN 陳述式
DECLARE @sql NVARCHAR(MAX) = '';
SELECT @sql += 'ALTER TABLE Table4 ADD ' + QUOTENAME(c.name) + ' ' +
TYPE_NAME(c.system_type_id) +
CASE WHEN c.max_length = -1 THEN '(MAX)'
WHEN c.system_type_id IN (167,175,231,239) THEN '(' + CAST(c.max_length AS VARCHAR) + ')'
ELSE '' END +
' ' + CASE WHEN c.is_nullable = 1 THEN 'NULL' ELSE 'NOT NULL' END + '; '
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE t.name = 'Table4'
AND c.name IN ('欄位1','欄位2','欄位3') -- 來源欄位清單
AND NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id = t.object_id AND name = c.name);
EXEC sp_executesql @sql;
-- 查詢表結構定義
SELECT
c.name AS ColumnName,
TYPE_NAME(c.system_type_id) AS DataType,
c.max_length, c.precision, c.scale,
c.is_nullable, c.is_identity
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE t.name = 'YourTable';
| 情境 | 推薦技法 | 關鍵點 |
|---|---|---|
| 新建表、僅結構 | SELECT INTO ... WHERE 1=0 | 最快、最標準 |
| 表已存在、需重建 | 暫存表 + DROP + sp_rename | 交易包裹確保原子性 |
| 表已存在、僅增欄位 | 動態 ALTER TABLE ADD | 保留現有資料、避免鎖表久 |
| 跨資料庫/伺服器 | 連結伺服器 + 同樣技法 | 四部份命名 [Server].[DB].[Schema].[Table] |
SELECT INTO 不複製:索引、約束、觸發器、權限、擴展屬性DROP/RENAME 會產生 Schema 修改鎖 (Sch-M),規劃維護窗口「僅複製結構」的核心技巧是 WHERE 條件永假 (1=0/1<>1),讓查詢優化器僅解析中繼資料而不掃描資料頁,極致高效。