-- 1. 建立目標表結構 (僅結構,無資料) SELECT TOP 0 * INTO TargetDB.dbo.M_Product FROM SourceDB.dbo.Product; -- 2. 全量匯入 INSERT INTO TargetDB.dbo.M_Product (col1, col2, ...) SELECT col1, col2, ... FROM SourceDB.dbo.Product; -- 或一次性建表+匯入 (僅限同實例) SELECT * INTO TargetDB.dbo.M_Product FROM SourceDB.dbo.Product;
| 項目 | 說明 |
|---|---|
| 索引/約束/觸發器 | 不會複製**,需手動在目標表重建 |
| Identity 欄位 | 會保留原值;若需重新種子,匯入後 `DBCC CHECKIDENT` |
| 資料類型相容 | 隱含轉換需符合優先級規則 (如 `INT`→`DECIMAL` 可,`VARCHAR`→`INT` 含非數字會失敗) |
| 目標表有資料 | `SELECT INTO` 會報錯 (表已存在);改用 `INSERT INTO` 追加 |
| 跨實例 | 需 `sp_addlinkedserver` 建立連結伺服器,四段式命名 `Server.DB.Schema.Table` |
-- 僅複製結構 (所有版本) SELECT TOP 0 * INTO NewTable FROM SourceTable; -- 或 WHERE 1=0 (標準 SQL) SELECT * INTO NewTable FROM SourceTable WHERE 1 = 0;
-- 建立連結 (需安裝 ACE OLEDB Provider)
EXEC sp_addlinkedserver @server = 'EXCEL_LINK',
@srvproduct = 'Excel',
@provider = 'Microsoft.ACE.OLEDB.12.0',
@datasrc = 'C:\Data\Import.xlsx',
@provstr = 'Excel 12.0 Xml;HDR=YES;IMEX=1';
-- 查詢工作表 (名稱含 $)
SELECT * FROM EXCEL_LINK...[Sheet1$];
-- 清除
EXEC sp_dropserver 'EXCEL_LINK', 'droplogins';
⚠️ **限制**:Excel 檔被開啟時無法查詢;大檔 (>10MB) 查詢極慢;生產自動化**嚴禁**直連 Excel,請先轉 CSV 再 `BULK INSERT`。
| 條件 | 推薦方案 |
|---|---|
| 同質 SQL Server、結構乾淨、網路通 | 方法一:`INSERT INTO ... SELECT ...` (可配合 `TABLOCK`、`WITH (NOLOCK)` 來源) |
| 異構來源、或資料需大幅清洗/人工確認 | 方法二:CSV/Excel 中轉 + Staging Table + T-SQL 規則化 |
| 增量同步 (CDC/觸發器/時間戳) | 方法一 + `MERGE` / `LEFT JOIN` 邏輯,排程執行 |
| TB 級歷史全量遷移 | 方法一 + 分區表 + 平行匯入 (多線程 `bcp` / SSIS / ADF) + 校驗 RowCount/Checksum |
**同質乾淨用直搬,異構髒資料用中轉**。工具次於流程:**導出 → 清洗 (自動化腳本優於手工) → Staging → 校驗 → 正式表 → 索引重建 → 統計更新 → 業務驗收**。