2014-03-13 47 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

您可以在遊標之前聲明一個表變量或創建一個臨時表,爲遊標的每次迭代插入(不選擇)它,然後在遊標之後選擇它。

但是,您可以通過使用交叉連接和助手錶來完成此操作,並且無需使用遊標,我建議您研究一下。