我需要在表格中存储一些记录。记录必须是唯一的,这一点至关重要。必须默默忽略所有重复项。
我编写了一个接受用户定义的表类型的过程,我向它发送了一个记录集合,并且我尝试存储了新的UNIQUE记录。
如何确定独特?我从几列中计算出SHA1。在我的表格中,我有一个Hash
列。它有UNIQUE
索引约束。
这是棘手的部分。我没有使用IF EXIST(SEELCT ..)
使用TRY / CATCH
块,而是让INSERT
在重复哈希上无声地失败。
所以我使用游标来获取我的行,然后我计算每行的哈希值,然后我尝试插入这一行。如果失败,则处理下一行。
有效。这很快。但是我对我的身份栏非常失望。
如果我尝试输入3个相同的记录和1个新记录,我会得到以下id-s:1,4。我希望1和2,而不是1和4.因此,每个失败的插入时,身份会增加。我需要避免它。
我尝试将INSERT
打包到TRANSACTION
块中的ROLLBACK
和CATCH
。它什么都不做。它有效,只是id-s错了。
有没有办法使用UNIQUE
约束来有效地过滤重复项,或者唯一的方法是使用IF EXISTS
方法?
使用UNIQUE
约束的速度真的比IF EXISTS
快吗?
更新 典型情况看起来像1000个重复和2个新行。将对此过程进行一些并发调用。我只是不希望它在我的表中有几百万行时显着减慢服务器速度。
答案 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)