存储过程跳过更新语句

时间:2017-04-13 19:58:17

标签: c# sql-server stored-procedures

我使用EXE每小时调用一次存储过程将数据从一组表移动到另一组表,同时还更新另一个表中的计数以显示存储过程运行的次数。 EXE调用具有一定数量的存储过程来告诉存储过程运行哪个插入。所以每小时,这个程序都运行两次:

If @intUploadNumber = 1
INSERT INTO Prod1
SELECT *
FROM Staging1

UPDATE tbl_Count
SET UpdateCount = UpdateCount + 1
WHERE Date = CAST(GETDATE() AS DATE)

If @intUploadNumber = 2
INSERT INTO Prod2
SELET *
FROM Staging2

UPDATE tbl_Count
SET UpdateCount = UpdateCount + 1
WHERE Date = CAST(GETDATE() AS DATE)

EXE基本上通过以下方式调用该程序:

exec STRPRC 1
exec STRPRC 2

存储过程的底部是以下内容:

IF ((select updatecount from tbl_Count WHERE Date = CAST(GETDATE() AS DATE)) % 2 = 0)
BEGIN 
INSERT INTO Prod3
SELECT *
FROM PROD1
LEFT JOIN PROD2 ON PROD1.CID = PROD2.CID
END

但是,我注意到我的代码,即使两个exec都被正确调用,并且从staging进入生产的所有内容,存储过程通常会经过最后一个if语句,而不是执行我的最后一个插入

有没有人知道MS SQL的问题会导致这种情况发生?也许是因为两次调用存储过程时,updatecount在到达最终if语句时都没有正确设置?我还有一个TRY ... CATCH围绕SQL应该将我的所有错误转储到另一个表中,但它仍然是空的。如果需要更多详细信息,请告知我们。 (不,我不能离开EXE分别调用两个初始插入,它们必须单独调用。)

谢谢

1 个答案:

答案 0 :(得分:2)

假设您使用参数1调用此存储过程,并且在那个时间点,您的UpdateCount是一个奇数值(让我们假设为1)

现在,您在SP中的代码流程如下:

Is @intUploadNumber = 1       => Yes then Insert
set updatecount to itself + 1 => updatecount is 2
Is @intUploadNumber = 2       => No then skip the Insert 
set updatecount to itself + 1 => updatecount is 3

此时,最后一个IF语句中的%(MOD)操作给出1而不是0,因此最终的INSERT不会被执行

我认为你想要在SP被调用两次时只增加一次UpdateCount。因此,您只需删除第一个UPDATE语句,只留下最后一个语句 但是我更喜欢总是使用BEGIN / END块分隔符,即使只有一个语句要执行

IF @intUploadNumber = 1
    BEGIN
        INSERT INTO Prod1 SELECT * FROM Staging1
    END
ELSE 
    BEGIN
        IF @intUploadNumber = 2
           BEGIN
              INSERT INTO Prod2 SELECT * FROM Staging2
           END
        ELSE
           RAISERROR ('Invalid parameter value',16,1)  
    END

UPDATE tbl_Count SET UpdateCount = UpdateCount + 1
WHERE Date = CAST(GETDATE() AS DATE)