我使用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分别调用两个初始插入,它们必须单独调用。)
谢谢
答案 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)