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