如何处理没有唯一 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,看看他们中的某个人是否可以为您提供一些帮助。
我正在处理数据库中的记录传输问题。我有一个 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,看看他们中的某个人是否可以为您提供一些帮助。