2017-05-31 174 views
0

所以我花了相當一段時間圍繞Stack Overflow尋找使這一點的SQL,將填充一個視圖中的字段項目已經工作的天數晚了。在SQL Server的每一行執行一個存儲過程表

的觀點從MS SQL Server上的兩個本地表(2008)連接的數據,我已經寫存儲過程來計算兩三天的工作日內,由被稱爲:

EXECUTE spWorkDaysLate '01/01/20XX', '01/02/20XX' 

然而我不知道如何遍歷視圖中的每條記錄,因爲這需要對錶中的每個條目執行。我的表中的相關字段是startDate,endDate,我將使用endDate和startDate作爲參數,使用上述存儲過程的結果填充最終字段(daysLate)。我發現了一些建議網上通過使用表格中的光標命令循環,這將是SQL我想運行:

DECLARE @MyCursor CURSOR; 
DECLARE @MyField int; 
SET @MyField = 'daysLate' /* Do need to do this, or is the an argument I pass? */ 

BEGIN 
    SET @MyCursor = CURSOR FOR 
    select top 1000 daysLate from dbo.vQualityControl 


    OPEN @MyCursor 
    FETCH NEXT FROM @MyCursor 
    INTO @MyField 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     /* 
     YOUR ALGORITHM GOES HERE 
     */ 

     FETCH NEXT FROM @MyCursor 
     INTO @MyField 
    END; 

    CLOSE @MyCursor ; 
    DEALLOCATE @MyCursor; 
END; 

我是相當新的SQL,所以我知道的僞代碼,我要運行有點像for each循環,這在我的心目中,我已經在尋找這樣的:

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     /* Bad code */ 
     daysLate.Value = EXECUTE spWorkDaysLate @startDate, @endDate; 

     FETCH NEXT FROM @MyCursor 
     INTO @MyField 
    END; 

我知道那語法錯誤的,所以我應該在循環到位,使現場「daysLate」被填充與被調用的存儲過程的結果?

+0

首先你想做的事,但在解決方案不看首先是因爲大部分時間,使「daysLate」字段獲取與填充不理解的根源問題,會造成更多的問題 – maSTAShuFu

+0

執行我的存儲過程是什麼做的結果。表格中的每條記錄都應該具有唯一的結果。 –

+0

好的,那麼SP中有什麼? – maSTAShuFu

回答

1

你有沒有試過FUNCTION,你可以在FUNCTION中計算兩天之間的工作日。

SELECT *, dbo.fn_WorkDaysLate (startDate, endDate) AS DaysLate FROM dbo.vQualityControl 
--OR 
UPDATE A 
    SET A.DaysLate = dbo.fn_WorkDaysLate (A.startDate, A.endDate) 
FROM dbo.vQualityControl A 
+0

我會用功能來代替 - 謝謝! –

+0

不客氣... :) –