2014-03-13 42 views
0

我被要求生成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

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

但是,您可以通过使用交叉连接和助手表来完成此操作,并且无需使用游标,我建议您研究一下。