1

我想實現遞歸CTE而不是跟隨遊標,因爲在遊標內部執行存儲過程時需要很多時間來插入數據,特別是當表中有大量記錄時。我已經嘗試過使用CTE表達式來解決這個問題,但是我沒能用CTE生成相同的結果,而光標真的很糟糕,而且我完全想用CTE替換它,所以有什麼辦法可以將它縮短。提前謝謝。在遞歸CTE而不是光標內以編程方式執行存儲過程

Declare @Emp_Id As Numeric  
    Declare CurEmpWeekOff cursor for   
    Select Emp_Id From tblEmployee Where Cmp_Id = @Cmp_Id And Branch_Id = @Branch_Id And Emp_WeekOff_Type = 1  

    open CurEmpWeekOff   
    Fetch next From CurEmpWeekOff Into @Emp_Id  
    while @@Fetch_Status = 0   
    Begin   
    If @Is_Sunday = 1  
    Exec [prcEmployee_WeekoffInsert] @Cmp_Id, @Branch_Id, @Emp_Id, @From_Date, 0, '', @Login_Id, 0  
    If @Is_Monday = 1  
    Exec [prcEmployee_WeekoffInsert] @Cmp_Id, @Branch_Id, @Emp_Id, @From_Date, 1, '', @Login_Id, 0  
    If @Is_Tuesday = 1  
    Exec [prcEmployee_WeekoffInsert] @Cmp_Id, @Branch_Id, @Emp_Id, @From_Date, 2, '', @Login_Id, 0  
    If @Is_Wednesday = 1  
    Exec [prcEmployee_WeekoffInsert] @Cmp_Id, @Branch_Id, @Emp_Id, @From_Date, 3, '', @Login_Id, 0  
    If @Is_Thursday = 1  
    Exec [prcEmployee_WeekoffInsert] @Cmp_Id, @Branch_Id, @Emp_Id, @From_Date, 4, '', @Login_Id, 0  
    If @Is_Friday = 1  
    Exec [prcEmployee_WeekoffInsert] @Cmp_Id, @Branch_Id, @Emp_Id, @From_Date, 5, '', @Login_Id, 0  
    If @Is_Saturday = 1  
    Exec [prcEmployee_WeekoffInsert] @Cmp_Id, @Branch_Id, @Emp_Id, @From_Date, 6, '', @Login_Id, 0  

    Fetch next From CurEmpWeekOff Into @Emp_Id  
    End   
    Close CurEmpWeekOff   
    Deallocate CurEmpWeekOff    
    End 
+1

爲什麼這需要遞歸?你能解釋一下這段代碼的意圖嗎? – SWeko

+0

我不明白爲什麼你需要循環。你能詳細說明元數據和你想要的嗎?這個問題太侷限了。 – Kangkan

+0

當管理員試圖爲當時所有員工重置weekoff daywise設置時,此代碼會執行,我需要更新主要weekoff表以及使用當前更改更新employee_weekoff表。 – mayurk

回答

2

這樣的事情呢?

Declare @Emp_Id As Numeric 
DECLARE @TempID INT 
DECLARE @DayOfWeek INT 

If @Is_Sunday = 1  
    SET @DayOfWeek = 1 
    If @Is_Monday = 1  
    SET @DayOfWeek = 2 

... INSERT REST HERE 
    If @Is_Saturday = 1  
    SET @DayOfWeek = 6 


DECLARE #TempEmp TABLE 
(
    ID INT IDENTITY, 
    EmpID INT 
) 

INSERT INTO #TempEmp 
(
    EmpID 
) 
Select Emp_Id From tblEmployee Where Cmp_Id = @Cmp_Id And Branch_Id = @Branch_Id And Emp_WeekOff_Type = 1 


WHILE EXISTS (SELECT 1 FROM #TempEmp) 
BEGIN 

    SELECT TOP 1 @TempID = ID, @Emp_ID = EmpID FROM #TempEmp 

    Exec [prcEmployee_WeekoffInsert] @Cmp_Id, @Branch_Id, @Emp_Id, @From_Date, @DayOFWeek, '',  @Login_Id, 0 

    DELETE FROM #TempEmp WHERE ID = @TempId 
END 
+0

我執行了這段代碼,它相當提高了執行速度,但它將DayOfWeek = 6添加到員工的每一行,並且您的意思是「CREATE TABLE #TempEmp」而不是「DECLARE #TempEmp TABLE」?非常感謝張貼這個答案,我仍然需要修改,以滿足我的條件。 – mayurk

+0

您需要更新將DayOfWeek變量設置爲適合的代碼 - 最好的情況說明。我只是不喜歡在這裏輸入它 - 它只是停止你不得不重複代碼來調用存儲過程。 – Paddy

+0

雅每次代替DayOfWeek與最後滿意條件,再次感謝我嘗試更新代碼,並會通知如果完成! :) – mayurk