在T-SQL过程中快速重复过滤

时间:2017-12-06 15:20:57

标签: sql-server

我需要在表格中存储一些记录。记录必须是唯一的,这一点至关重要。必须默默忽略所有重复项。

我编写了一个接受用户定义的表类型的过程,我向它发送了一个记录集合,并且我尝试存储了新的UNIQUE记录。

如何确定独特?我从几列中计算出SHA1。在我的表格中,我有一个Hash列。它有UNIQUE索引约束。

这是棘手的部分。我没有使用IF EXIST(SEELCT ..)使用TRY / CATCH块,而是让INSERT在重复哈希上无声地失败。

所以我使用游标来获取我的行,然后我计算每行的哈希值,然后我尝试插入这一行。如果失败,则处理下一行。

有效。这很快。但是我对我的身份栏非常失望。

如果我尝试输入3个相同的记录和1个新记录,我会得到以下id-s:1,4。我希望1和2,而不是1和4.因此,每个失败的插入时,身份会增加。我需要避免它。

我尝试将INSERT打包到TRANSACTION块中的ROLLBACKCATCH。它什么都不做。它有效,只是id-s错了。

有没有办法使用UNIQUE约束来有效地过滤重复项,或者唯一的方法是使用IF EXISTS方法?

使用UNIQUE约束的速度真的比IF EXISTS快吗?

更新 典型情况看起来像1000个重复和2个新行。将对此过程进行一些并发调用。我只是不希望它在我的表中有几百万行时显着减慢服务器速度。

1 个答案:

答案 0 :(得分:0)

您可以使用SET IDENTITY INSERT并控制该标识字段,直到插入结束:

SET IDENTITY INSERT ON
CURSOR --increasing also counter for identity column and setting it during loop
SET IDENTITY INSERT OFF

顺便问一下,你确定你不能避免使用游标吗? 您可以使用EXCEPT仅获取尚未存在的值,并将它们仅插入一个语句中,这肯定会更快;只是提出一个想法:

INSERT INTO DestTable
SELECT * FROM (SELECT * FROM SourceTable
               EXCEPT 
               SELECT * FROM DestTable)