Sql server 2008 检查记录是否存在并以最有效的方式退出
我的存储过程中有以下脚本Sql server 2008 检查记录是否存在并以最有效的方式退出,sql-server-2008,tsql,Sql Server 2008,Tsql,我的存储过程中有以下脚本 IF EXISTS(SELECT * FROM dbo.MBLPosition WHERE PositionGKey = @i_PositionGKey) RETURN -- DO SOME STUFF HERE INSERT dbo.MBLPosition.. 我正在将一些数据插入到单记录表中。首先我检查它是否已经存在,然后我进行一些处理并插入记录 处理可能需要一些时间,比如说2秒钟。有时调用随后进入,我会遇到约束异常。罕见,但也会发生。我想避免这种情况,同时,
IF EXISTS(SELECT * FROM dbo.MBLPosition WHERE PositionGKey = @i_PositionGKey) RETURN
-- DO SOME STUFF HERE
INSERT dbo.MBLPosition..
我正在将一些数据插入到单记录表中。首先我检查它是否已经存在,然后我进行一些处理并插入记录
处理可能需要一些时间,比如说2秒钟。有时调用随后进入,我会遇到约束异常。罕见,但也会发生。我想避免这种情况,同时,如果记录已经存在,我不想进行这种处理。构造此代码的最佳方法是什么,这样我就不会做额外的工作并避免异常
这是一张很大的桌子,随时都有记录。当重复数据进入并且不需要花费太多处理时间时,过滤掉重复数据的最佳方法是什么?您应该使用足够的隔离级别,以使测试和后续插入成为原子级
如果遇到死锁,您可能需要打开快照隔离,正如您所说,处理可能需要一些时间,尽管2秒似乎很长……您应该使用足够的隔离级别,以使测试和后续插入成为原子的
如果遇到死锁,您可能需要打开快照隔离,正如您所说,处理可能需要一些时间,尽管2秒似乎很长……一种方法是执行检查,然后始终可以使用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
我在这里讨论了一个类似的主题:一种方法是执行检查,然后始终可以使用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
我在这里讨论了一个类似的主题:您可能想要使用,并且仅当不匹配零件时才使用。这将是测试和插入一次。可能的重复您可能想使用,并做时不匹配的部分只。这将是测试和插入一次。可能的副本,你能详细说明正确的交易处理吗?你能详细说明正确的交易处理吗?谢谢你,你的文章帮助我作出决定。在我的例子中,重复的百分比非常小,所以我甚至可以从使用TRY-CATCH中获益。谢谢你,你的文章帮助我做出了决定。在我的例子中,重复的百分比非常小,所以我甚至可以从使用TRY-CATCH中获益。