如何处理没有唯一 ID 的插入和重复

How to deal with inserts and duplicates without an unique ID

我正在处理数据库中的记录传输问题。我有一个 TableA 包含原始数据(最接近唯一标识符的是时间戳和我之前创建的 IDENTITY (1,1) )和 TableB 这是相同的数据但使用存储过程处理在某些情况下,这会根据我们正在处理的数据的性质重复记录(因此拆分记录的 ID 相同等等)。

用户每次 "bulk" 将更新的文件中的新数据插入 TableA 后,用户都希望 运行 存储过程,因此该过程类似于:

... > USER INSERTS INTO TableA > USER RUNS STORED PROCEDURE > PROCEDURES INSERTS INTO TableB > REPEAT

我的问题是,当 运行 存储过程时,它会 运行 TableA x 次,显然一遍又一遍地添加相同的数据并增加 ID 值,我正在考虑使用 WHERE NOT EXISTS 但同样,在 运行 执行该过程后我没有唯一 ID。由于数据库的大小,清理 TableB 和重新填充并不可靠,出于同样的原因,我也需要避免触发器。

什么是最简洁实用的方法?

这绝对不是一个完美的解决方案,但它是对如何处理 TableA 中大于 [=13] 中最新值的 datetimes 数据的问题的回答=].

这里通常应用的模式是构造存储过程,该存储过程使用类似这样的东西处理 TableA 数据。

SET ISOLATION LEVEL REPEATABLE READ;

DECLARE @LastTimestamp DATETIME;

BEGIN TRY
BEGIN TRANSACTION

  SELECT 
    @LastTimestamp = MAX(TimestampColumn) 
  FROM 
    TableB;

  INSERT #StagingTable
    <ColumnList>
  SELECT
    <ColumnList>
  FROM
    TableA
  WHERE 
    TimestampColumn > @LastTimestamp;

  <Stored procedure magic, performed on #StagingTable....>

  INSERT TableB
    <ColumnList>
  SELECT
    <ColumnList>
  FROM
    #StagingTable;

  COMMIT TRANSACTION;

END TRY
BEGIN CATCH

  ROLLBACK TRANSACTION;
  <Other Error Handling>

END CATCH;

您可以采取任何措施来确保 INSERT 进入 TableA 的交易已明确声明,但通过使用 REPEATABLE READ Isolation Level,您将获得 一些 的保护,避免 INSERT 发生在一起。

您也可能值得花时间研究一下 Change Tracking and Change Data Capture,看看他们中的某个人是否可以为您提供一些帮助。