Sql-Server

在保留 IDENTITY 的同時將行插入其他表

  • January 15, 2013

我在 SQL Server 表上執行 ETL 邏輯。我將把數據從一個表同步到另一個表。對於需要基於源表添加到目標表的所有記錄,我正在對目標表中的這些行進行插入。架構將其中一列定義為標識列。因此 SQL Server 會自動為插入的新行增加 id。因為我要移動現有的 id,所以我需要刪除標識,插入這些行,然後重新應用標識,然後重置種子,使其與源表匹配。如何以程式方式完成?

  1. 我可以從現有列中刪除身份聲明嗎?
  2. 我可以將現有列標記為身份嗎?
  3. 如何重置標識列的種子?

雖然它不會自動防止重複,但您可以使用以下命令暫時禁用標識,然後您可能只想將標識種子設置為表中的最大值:

SET IDENTITY_INSERT dbo.tablename ON;

INSERT ...

SET IDENTITY_INSERT dbo.tablename OFF;

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = N'DBCC CHECKIDENT(''dbo.tablename'', RESEED, '
  + RTRIM(MAX(id_column_name)) + ');' FROM dbo.tablename;

EXEC sp_executesql @sql;

我不確定糾正重複項的最佳做法是什麼。如果在重新設定種子後插入 1000 個新行,則源系統很可能會生成新的標識值,這些標識值會發生衝突。您可能會考慮做的只是簡單地設置一個標識值以生成遠高於另一個表永遠無法達到的範圍(比如 10 億)的數字。你仍然可以使用IDENTITY_INSERT來合併,但永遠不會有衝突。這也使得確定行是在本地生成還是導入的變得非常容易。

引用自:https://dba.stackexchange.com/questions/32909