2013-05-14 72 views
1

我有這樣的select語句如何遍歷存儲過程記錄集?

declare @t table (Percentage float) 
DECLARE @acc INT 
SET @acc = 1 
DECLARE @max INT 
select @max = max(HireID) from NewHire 
WHILE (@acc <= @max) 
    BEGIN 
     IF (@acc in (select HireID from NewHire)) 
      BEGIN try 
       insert into @t 
       select 
        CAST((select COUNT(*) from Hire_Response WHERE HireID = @acc AND (HireResponse = 0 OR HireResponse = 1)) as FLOAT)/
        CAST((select COUNT(*) from Hire_Response WHERE HireID = @acc) as FLOAT) 
      END try 
      begin catch 
       insert into @t 
       select 0.0 
      end catch 
     set @acc = @acc + 1 
    END 
select * from @t 

在這段代碼中,我被它的ID通過所有的NewHire記錄循環,從1到最高的國家之一。我意識到這不是我想要做的。現在基本上我有這個名爲sp_selectNewHire2SQL的存儲過程,它以特定的方式獲取NewHire表。我想調用它,並獲取它的返回記錄集,然後從上到下循環。

注意:做來自ID循環來最高不會工作了,因爲編號的順序可以混合起來。

有沒有辦法做到這一點?

謝謝。

+0

不,這是如何工作的? – omega 2013-05-14 15:09:08

+2

你不想循環,你需要停止思考它的循環條件,這不是你處理數據庫代碼的方式。你需要考慮數據集。循環是最後的手段,從來沒有第一個,因爲它是緩慢和低效的。 – HLGEM 2013-05-14 15:09:19

+1

請勿在任何情況下使用遊標!!!!!!!!! – HLGEM 2013-05-14 15:09:46

回答

0
select 
    NH.HireID, 
    ISNULL(1E0 * 
      COUNT(CASE WHEN HireResponse IN (0,1) THEN HR.HireID END)/
      NULLIF(COUNT(HR.HireID), 0) 
     , 0) AS percentage 
from 
    NewHire NH 
    LEFT JOIN 
    Hire_Response HR ON NH.HireID = HR.HireID 
group by 
    NH.HireID 

請注意,您需要在輸出中包含HireID。有沒有保證的順序設置,除非ORDER BY結果被使用,所以你不能假設你的百分比名單將是爲了

+0

但是,還有一種方法也納入我的存儲過程,因爲它以特定的方式返回NewHire表,然後我需要從該表中從上到下得到百分比? – omega 2013-05-14 15:16:28

+0

請參閱http://stackoverflow.com/questions/6332509/call-a-stored-procedure-in-sql-cte/6332549#6332549和http://stackoverflow.com/questions/5439005/set-var-exec- storedprocedure/5441380#5441380如何捕獲存儲的prcoedure輸出。然後使用這個臨時表而不是NewHire。如果你真的想 – gbn 2013-05-14 15:18:38

0

基本上你創建一個臨時表中的列存儲的過程將返回。然後通過執行存儲的proc作爲插入的一部分將數據插入到其中。然後,您使用選擇標準而不是價值統計信息插入到表格中。

另外,您可以創建isnted的存儲過程的表值函數,做只有一個插入的一個選擇statment是CALS的表值函數的一步。