我正在处理数据库中的记录传输问题。我有一个TableA
,其中包含原始数据(最接近唯一标识符的是时间戳和我之前创建的IDENTITY (1,1)
)和TableB
,它是相同的数据,但已通过存储过程进行了处理在某些情况下会根据我们正在处理的数据的性质来复制记录(对于拆分的记录,使用相同的ID,依此类推)。
用户希望每次“批量”将新数据从已更新的文件插入TableA
中后每次都运行存储过程,因此该过程将类似于:
... > USER INSERTS INTO TableA > USER RUNS STORED PROCEDURE > PROCEDURES INSERTS INTO TableB > REPEAT
我的问题是,在运行存储过程时,它将运行TableA
x次,并且显然一遍又一遍地添加相同的数据并增加ID值,我当时在考虑使用WHERE NOT EXISTS
但是同样,运行该过程后,我没有唯一的ID。由于数据库的大小,清理TableB
并重新填充是不可靠的,出于同样的原因,我还需要避免触发器。
什么是最干净实用的方法?
答案 0 :(得分:1)
这绝对不是一个完美的解决方案,但这是对以下问题的答案:如何处理git am
的{{1}}中的数据,这些数据大于git.exc.GitError
中的最新值
通常在这里应用的模式将是使用这种方法来构造正在处理TableA
数据的存储过程。
datetimes
您可以采取任何措施确保TableB
中的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;
Isolation Level,您将得到< em> some 保护免受INSERT
的影响同时发生。
也许值得您花时间研究Change Tracking和Change Data Capture,看看其中之一是否可以为您提供帮助。