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

SQL Server 複製表結構到指定表:SELECT INTO 與動態重建兩大技法

     編輯:關於SqlServer

問題情境

需將 TableA.欄位1、TableB.欄位2、TableC.欄位3 合併建立 Table4,**僅複製結構,不含資料**。

情境一:目標表不存在 → SELECT INTO 配合 WHERE 1=0

SELECT a.欄位1, b.欄位2, c.欄位3
INTO Table4
FROM TableA a, TableB b, TableC c
WHERE 1 = 0;  -- 條件永假,不產生資料列,僅複製結構
  • ✅ 最簡潔、效能最佳
  • ✅ 自動推斷資料類型、NULL 屬性、IDENTITY
  • ❌ Table4 若已存在會報錯

情境二:目標表已存在 → 動態重建法

-- 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),讓查詢優化器僅解析中繼資料而不掃描資料頁,極致高效。

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