检查记录是否存在并以最有效的方式退出

时间:2012-06-12 02:04:40

标签: sql-server-2008 tsql

我的存储过程中有以下脚本

IF EXISTS(SELECT * FROM dbo.MBLPosition WHERE PositionGKey = @i_PositionGKey) RETURN

-- DO SOME STUFF HERE

INSERT dbo.MBLPosition..

我正在将一些数据插入表格(单个记录)。首先,我检查它是否已经存在,然后我做一些处理并插入记录。

处理可能需要一些时间 - 比方说2秒。有时候调用会进来,我会得到约束异常。很少见,但却发生了。我想避免这种情况,同时如果记录已存在,我不想进行此处理。构造此代码的最佳方法是什么,所以我不做额外的工作并避免异常?

这是一张包含记录的大表。在进入dupes时过滤掉dupes的最佳方法是什么,并且不需要花费太多的处理时间?

2 个答案:

答案 0 :(得分:6)

一种方法是执行检查,然后你总是可以使用try / catch来尝试插入。正如@MitchWheat指出的那样,您可以使用正确的事务处理来消除这种情况。

IF NOT EXISTS
(
  SELECT 1 FROM dbo.MBLPosition 
  WHERE PositionGKey = @i_PositionGKey
)
BEGIN
  BEGIN TRY
    -- do some stuff here
    INSERT dbo.MBLPosition..
  END TRY
  BEGIN CATCH 
    PRINT 'Not an exception, but insert failed';
  END CATCH
END

我在这里处理了一个类似的主题:http://www.mssqltips.com/sqlservertip/2632/checking-for-potential-constraint-violations-before-entering-sql-server-try-and-catch-logic/

答案 1 :(得分:3)

您应该使用transaction(具有足够的隔离级别)来进行测试,然后使用INSERT原子。

如果你遇到死锁,你可能想要打开快照隔离(正如你所说处理可能需要一些时间,虽然2秒似乎很长......)