2013-05-14 52 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的表值函数的一步。