在递归CTE而不是Cursor内以编程方式执行存储过程

时间:2013-05-16 08:37:43

标签: sql sql-server tsql stored-procedures common-table-expression

我想实现递归CTE而不是跟踪游标,因为通过在游标内部以programatecally执行存储过程来插入数据需要花费大量时间,尤其是当表中有大量记录时。我已经尝试过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 个答案:

答案 0 :(得分: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
相关问题