一意の制約を持つテーブルがあります:
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
、それは予期されていなかったエラーのためだと思います(デッドロックや、重複が予期されない場合の制約など)。この場合、ユーザーが重複して送信しようとする可能性があるため、エラーが予想されます。
ほとんどの挿入が成功した場合でも、重複のチェックはそれほど遅くないと述べているアーロン・バートランドの記事を見つけました。
ネット上には、Try/Catch を使用するためのアドバイスがたくさんあります (1 つではなく 2 つのステートメントを避けるため)。私の環境では、失敗するケースが 1% 程度ある可能性があるため、そのようなことも理にかなっています。
あなたの意見は何ですか?オプション 1 またはオプション 2 を使用する他の理由は何ですか?
更新: この場合、それが重要かどうかはわかりませんが、更新トリガーの代わりにテーブルがあります (監査目的で、行の削除も Update ステートメントを介して行われます)。