在保留 IDENTITY 的同时将行插入其他表

Mac*_*ver 3 sql-server-2008 sql-server etl t-sql identity

我正在 SQL Server 表上执行 ETL 逻辑。我要将数据从一张表同步到另一张表。对于需要基于源表添加到目标表的所有记录,我正在对目标表中的这些行进行插入。架构将其中一列定义为标识列。因此 SQL Server 会自动增加插入的新行的 id。因为我要移动现有的 id,所以我需要删除标识,插入这些行,然后重新应用标识,然后重置种子以使其与源表匹配。这如何以编程方式完成?

  1. 我可以从现有列中删除身份声明吗?
  2. 我可以将现有列标记为身份吗?
  3. 如何重置标识列的种子?

Aar*_*and 14

虽然它不会自动防止重复,但您可以使用以下命令暂时禁用身份,然后您可能只想将身份种子设置为表中的最高值:

 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;
Run Code Online (Sandbox Code Playgroud)

我不确定您纠正重复项的最佳做法是什么。如果在重新设定种子后插入 1000 行新行,源系统很可能会生成会发生冲突的新标识值。您可能会考虑做的是简单地设置一个标识值以生成远高于另一个表永远无法达到的范围(例如 10 亿)的数字。您仍然可以使用IDENTITY_INSERT来合并,但永远不会有冲突。这也使得确定一行是本地生成还是导入变得非常容易。