从游标中选择行到一个结果集

时间:2014-03-13 12:43:53

标签: sql-server-2008 reporting-services cursor resultset

我被要求制作SSRS 2008报告,该报告将打印零件标签。零件部门希望能够选择订单上的哪个零件编号需要每件的标签。例如,如果客户订购50个螺栓,那么他们想要打印50个标签,但如果他们订购了5个轮胎,他们想要为每个轮胎打印标签。选择不是问题,问题在于编写查询以便为SSRS获取一个结果集。我正在使用SQL Server 2008 R2。

我的查询:

declare @pmf varchar(4), @pro varchar(25), @desc varchar(50), @qty decimal(15, 2),    @count int
declare csr cursor for
select opl.psk_pmf_id, 
       opl.psk_pro_id, 
       case when charindex(';', pdi.pdi_desc) = 0 then pdi.pdi_desc 
            else SUBSTRING(pdi.pdi_desc, 1, CHARINDEX(';', pdi.pdi_desc) - 1) end, 
       convert(integer, opl.opl_q_all)
from oph inner join opl on oph.oph_id = opl.oph_id
         inner join pdi on opl.psk_pmf_id = pdi.pmf_id and opl.psk_pro_id = pdi.pro_id
where oph.oph_doc_id = 'C1216974'
order by opl.psk_pmf_id, opl.psk_pro_id
open csr
fetch next from csr into @pmf, @pro, @desc, @qty
while @@FETCH_STATUS = 0
begin
        if rtrim(@pmf) + rtrim(@pro) in ('CAT0308144', 'CAT1P0808')
        begin 
        select @pmf as pmf, @pro as pro, @desc as dscr, cast(@qty as integer) as qty 
        fetch next from csr into @pmf, @pro, @desc, @qty
    end
    else
        set @count = 1
        while @count <= @qty
        begin
            select @pmf as pmf, @pro as pro, @desc as dscr, 1 as qty
            set @count = @count + 1
        end
        fetch next from csr into @pmf, @pro, @desc, @qty
end
close csr
deallocate csr

这给了我正确的数据。忽略if rtrim(@pmf) + rtrim(@pro) in ('CAT0308144', 'CAT1P0808'),即可确认返回正确的行数。问题是这会产生255行,每行一个记录。我想要的是一个255行的数据集。我试过选择一个当然没有用的临时表。然后我考虑创建一个要插入的表,但我每次都要截断它,如果两个用户同时使用它会变得很难看。

么?

1 个答案:

答案 0 :(得分:1)

您可以在光标之前声明表变量或创建临时表,为光标的每次迭代插入(而不是选择)它,然后在光标之后从中选择。

但是,您可以通过使用交叉连接和帮助程序表来更快更简单地完成此任务,而无需使用游标 - 我建议您查看。< / p>