兩個結構相同的資料表(含 IDENTITY 欄位),嘗試跨資料庫/資料表複製資料:
INSERT INTO wzgl2004.dbo.kc SELECT * FROM wzgl2003.dbo.kc
報錯:
僅當使用了資料行清單,且 IDENTITY_INSERT 為 ON 時,才能在資料表 'wzgl2004.dbo.kc' 中為識別欄位指定明確值。
-- 1. 開啟 IDENTITY_INSERT
SET IDENTITY_INSERT wzgl2004.dbo.kc ON;
-- 2. 明確指定資料行清單(必須包含識別欄位)
INSERT INTO wzgl2004.dbo.kc (Id, Name, ...其他欄位...)
SELECT Id, Name, ...其他欄位... FROM wzgl2003.dbo.kc;
-- 3. 關閉 IDENTITY_INSERT
SET IDENTITY_INSERT wzgl2004.dbo.kc OFF;
SELECT *SET IDENTITY_INSERT [database.[schema.]]資料表名稱 {ON | OFF}
| 參數 | 說明 |
|---|---|
| database | 資料庫名稱 |
| schema | 結構描述擁有者(通常為 dbo) |
| 資料表名稱 | 含識別欄位的目標資料表 |
-- 假設 SourceDB.dbo.Orders 和 TargetDB.dbo.Orders 結構相同
-- OrderID 為 IDENTITY(1,1)
SET IDENTITY_INSERT TargetDB.dbo.Orders ON;
INSERT INTO TargetDB.dbo.Orders (OrderID, CustomerID, OrderDate, Amount, Status)
SELECT OrderID, CustomerID, OrderDate, Amount, Status
FROM SourceDB.dbo.Orders
WHERE OrderDate >= '2024-01-01';
SET IDENTITY_INSERT TargetDB.dbo.Orders OFF;
-- 同步後檢查識別種子
DBCC CHECKIDENT('TargetDB.dbo.Orders', NORESEED);
| 錯誤做法 | 正確做法 |
|---|---|
INSERT INTO Target SELECT * FROM Source | 明確列出所有欄位名稱 |
| 未開啟 IDENTITY_INSERT 就插入識別欄 | 先 SET IDENTITY_INSERT ON |
| 同時對兩個表開啟 IDENTITY_INSERT | 分批處理,一張表完成關閉後再處理下一張 |
| 插入重複識別值 | 確認來源識別值在目標表不存在,或先調整目標種子 |