2010-05-28 73 views
2

我需要在一堆記錄上運行存儲過程。我現在的代碼遍歷存儲在臨時表中的記錄。存儲過程返回一個記錄表。我需要在多個記錄上運行存儲過程

我想知道我能做些什麼來避免迭代,如果有的話。

set @counter = 1  
set @empnum = null  
set @lname = null  
set @fname = null  
-- get all punches for employees  
while exists(select emp_num, lname, fname from #tt_employees where id = @counter)  
begin  
    set @empnum = 0  
    select @empnum = emp_num, @lname = lname , @fname= fname from #tt_employees where id = @counter  

    INSERT @tt_hrs  
    exec PCT_GetEmpTimeSp 
     empnum  
    ,@d_start_dt  
    ,@d_end_dt  
    ,@pMode = 0  
    ,@pLunchMode = 3  
    ,@pShowdetail = 0  
    ,@pGetAll = 1   

    set @counter = @counter + 1  
end 

回答

0

我認爲你是在正確的軌道上。 你可以有標識列的臨時表中的記錄插入到該臨時表

CREATE TABLE #A (ID INT IDENTITY(1,1) NOT NULL, Name VARCHAR(50)) 

後,發現表中的記錄總數。

DECLARE @TableLength INTEGER 
SELECT @TableLength = MAX(ID) FROM #A 

DECLARE @Index INT 
SET @Index = 1 

WHILE (@Index <[email protected]) 
BEGIN 

-- DO your work here 

SET @Index = @Index + 1 


END 

與您已經提議的類似。 迭代記錄的替代方法是使用CURSOR。不惜任何代價避免使用CURSORS。

+0

是的,那是我開始的地方。我想知道是否有另一種方式,我可以做這個海量存儲過程調用,而不是迭代。 – Casey 2010-05-28 14:37:54

2

避免這種迭代的一種方法是分析存儲過程中的代碼並進行修改,以便一次處理一組輸入,而不是一次處理一組輸入。通常情況下,這是不可能的,這就是迭代循環並不罕見的原因。

一種可能的選擇是使用APPLY功能(交叉應用,外部應用)。要做到這一點,你已經重寫了程序爲一體的表型功能之一,制定該功能在查詢像這樣:

INSERT @tt_hrs  
select [columnList] 
from #tt_employees 
    cross apply dbo.PCT_GetEmpTimeFunc(emp_num, @d_start_dt, @d_end_dt, 0, 3, 0, 1) 

(目前尚不清楚所有你輸入的程序是來自於。)

請注意,您仍在迭代調用該函數,但現在它被「打包」爲一個查詢。