2017-04-13 173 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)