2017-04-13 128 views
1

我正在使用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都被正确调用,并且从分段执行的所有内容都进入了生产环境,但存储过程通常会经过最后一个if语句,而不是e执行我的最终插入。

有谁知道MS SQL的问题会允许这种情况发生吗?也许是因为这两次调用存储过程时,updatecount在它碰到最终的if语句时没有被正确设置?我还有一个TRY ... CATCH环绕SQL,它应该把我所有的错误转储到另一个表中,但它仍然是空的。如果需要更多细节,请告诉我。 (不,我不能远离EXE调用两个单独的初始插入的移动,它们必须单独调用。)

谢谢

+2

*总是使用BEGIN/END块分隔符连“有谁知道用MS SQL中的问题,将允许这样的事情发生吗?” *是,它做你告诉它。我建议你在那里设置一个断点,或者放入一些日志记录或者其他东西,并且确保'select updatecount from tbl_Count WHERE Date = CAST(GETDATE()AS DATE))%2 = 0'返回的值是你认为的值是。 –

+1

您是否真的复制并粘贴了该代码? B/c明显的错字在SELET – peterG

+1

您需要提供更多详细信息。也许你有这个整个事情在一个空的捕获尝试?你需要养成明确的插入习惯。您需要为每列指定名称,而不是使用select *作为源。 –

回答

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 

在这一点上,在过去如果%(MOD)操作声明给你1而不是0,因此最终插入不执行

我认为你想增加UpdateCount一次,而不是两次调用SP。所以你可以简单地删除第一条UPDATE语句,只留下最后一条。
不过我更喜欢当你只有一个语句执行

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)