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的最佳方法是什么?
一种方法是执行检查,然后您可以始终使用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/