我有一个存储过程,它运行一系列插入,但在某些情况下,似乎其中一个插入没有运行,但其后的其余代码运行正常。
DECLARE @ID1 int
DECLARE @ID2 int
-- This works
INSERT INTO table1 (field1,field2)
VALUES('test', 1)
SELECT @ID1 = SCOPE_IDENTITY() -- This picks up the correct ID
-- This sometimes doesn't seem to run or an error of some sort happens infrequently
INSERT INTO table2 (field1, field2, field3, field4, field5)
VALUES(1,2,3,4,@ID1)
-- This always runs, but if the previous insert doesn't run inserts the previous ID into @ID2
SELECT @ID2 = SCOPE_IDENTITY()
-- Inserts the ID from the previous step and therefore is sometimes wrong
INSERT INTO table3 (field1,field2)
VALUES ('testing', @ID2)
这是SP的编辑样本。为什么这有时会发生?我会想到如果INSERT
存在问题,其余的程序会炸毁吗?但是相同的代码在大多数情况下由同一个人运行。我已经检查了问题同时是否有任何表锁定,但似乎没有任何我能发现的东西。
找出问题的最佳方法是什么?或者我应该如何重构上述代码以否定可能产生的影响呢?
答案 0 :(得分:1)
将TRY / CATCH
放在第二个INSERT周围以查看可能的错误。
答案 1 :(得分:1)
在插入行后检查@@错误,看看"沉默"错误被抛出。 您也可以尝试将插入行包装在TRY / CATCH块中,但我怀疑这不会很有成效,因为我假设您在管理工作室的输出窗口中没有出现任何错误?
尝试运行SQL事件探查器以及存储过程的运行,以查看它是否提供有关失败的任何进一步信息。
对存储过程的以下更改可能会在SP本身内为您提供尽可能多的信息。 它不是完美的代码,但它应该提供任何错误发生和被吞噬的正确指示":
mmap
答案 2 :(得分:0)
使用try / catch并在catch语句中引发错误。 Eg-:
CREATE PROC Usp_InsertBulkRecord
AS
BEGIN
BEGIN TRY
DECLARE @ID1 int
DECLARE @ID2 int
-- This works
INSERT INTO table1 (field1,field2)
VALUES('test', 1)
SELECT @ID1 = SCOPE_IDENTITY() -- This picks up the correct ID
-- This sometimes doesn't seem to run
INSERT INTO table2 (field1, field2, field3, field4, field5)
VALUES(1,2,3,4,@ID1)
-- This always runs, but if the previous insert doesn't run inserts the previous ID into @ID2
SELECT @ID2 = SCOPE_IDENTITY()
-- Inserts the ID from the previous step and therefore is sometimes wrong
INSERT INTO table3 (field1,field2)
VALUES ('testing', @ID2)
END TRY
BEGIN CATCH
DECLARE @Error varchar(8000)
SET @Error= Convert(varchar,ERROR_NUMBER()) + '*****' + Convert(varchar(4000),ERROR_MESSAGE())
+ '*****' + isnull(Convert(varchar,ERROR_PROCEDURE()),'[Usp_InsertBulkRecord]')
+ '*****' + Convert(varchar,ERROR_LINE()) + '*****' + Convert(varchar,ERROR_SEVERITY())
+ '*****' + Convert(varchar,ERROR_STATE())
RAISERROR (@Error,16,1);
END CATCH
END