我有一个具有唯一约束的表:
create table dbo.MyTab
(
MyTabID int primary key identity,
SomeValue nvarchar(50)
);
Create Unique Index IX_UQ_SomeValue
On dbo.MyTab(SomeValue);
Go
哪个代码更适合检查重复项(如果找到重复项,则成功 = 0)?
选项1
Declare @someValue nvarchar(50) = 'aaa'
Declare @success bit = 1;
Begin Try
Insert Into MyTab(SomeValue) Values ('aaa');
End Try
Begin Catch
-- lets assume that only constraint errors can happen
Set @success = 0;
End Catch
Select @success
选项 2
Declare @someValue nvarchar(50) = 'aaa'
Declare @success bit = 1;
IF EXISTS (Select 1 From MyTab Where SomeValue = @someValue)
Set @success = 0;
Else
Insert Into MyTab(SomeValue) Values ('aaa');
Select @success
从我的角度来看 - 我确实相信这Try/Catch
是因为错误,这是不期望的(比如死锁,甚至在不期望重复时的约束)。在这种情况下 - 有时用户可能会尝试提交副本,因此会出现错误。
我发现Aaron Bertrand 的文章指出,即使大多数插入成功,检查重复项也不会慢很多。
网上也有大量使用 Try/Catch 的建议(以避免 2 个语句而不是 1 个语句)。在我的环境中,可能只有 1% 的不成功案例,所以这也是有道理的。
你有什么意见?使用选项 1 或选项 2 的其他原因是什么?
更新:我不确定在这种情况下它是否重要,但表有而不是更新触发器(出于审计目的 - 行删除也通过更新语句发生)。