我的存储过程中有以下脚本
IF EXISTS(SELECT * FROM dbo.MBLPosition WHERE PositionGKey = @i_PositionGKey) RETURN
-- DO SOME STUFF HERE
INSERT dbo.MBLPosition..
我正在将一些数据插入表格(单个记录)。首先,我检查它是否已经存在,然后我做一些处理并插入记录。
处理可能需要一些时间 - 比方说2秒。有时候调用会进来,我会得到约束异常。很少见,但却发生了。我想避免这种情况,同时如果记录已存在,我不想进行此处理。构造此代码的最佳方法是什么,所以我不做额外的工作并避免异常?
这是一张包含记录的大表。在进入dupes时过滤掉dupes的最佳方法是什么,并且不需要花费太多的处理时间?
答案 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秒似乎很长......)