我被要求制作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行的数据集。我试过选择一个当然没有用的临时表。然后我考虑创建一个要插入的表,但我每次都要截断它,如果两个用户同时使用它会变得很难看。
么?
答案 0 :(得分:1)
您可以在光标之前声明表变量或创建临时表,为光标的每次迭代插入(而不是选择)它,然后在光标之后从中选择。
但是,您可以通过使用交叉连接和帮助程序表来更快更简单地完成此任务,而无需使用游标 - 我建议您查看。< / p>