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

kat*_*tit 1 t-sql sql-server-2008

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

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

-- DO SOME STUFF HERE

INSERT dbo.MBLPosition..
Run Code Online (Sandbox Code Playgroud)

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

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

这是一张大表,记录一直在进行.在进入dupes并且不花费太多处理时间的情况下过滤掉dupes的最佳方法是什么?

Aar*_*and 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
Run Code Online (Sandbox Code Playgroud)

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