存储过程的部分内容未运行

时间:2015-07-24 08:46:15

标签: sql-server tsql stored-procedures scope-identity

我有一个存储过程,它运行一系列插入,但在某些情况下,似乎其中一个插入没有运行,但其后的其余代码运行正常。

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存在问题,其余的程序会炸毁吗?但是相同的代码在大多数情况下由同一个人运行。我已经检查了问题同时是否有任何表锁定,但似乎没有任何我能发现的东西。

找出问题的最佳方法是什么?或者我应该如何重构上述代码以否定可能产生的影响呢?

3 个答案:

答案 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