2013-05-07 53 views
0

我的存儲過程有兩個遊標。 存儲過程的輸出格式如下。存儲過程輸出錯誤

companyid companyname          id   idname            level3            level4            level5                                                               currency           accountdefinition         accname           accountno debits         credits 
----------- -------------------------------------------------- ----------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------- --------------------------------------- --------------------------------------- 
101   Fund One Company         1001  Test Fund           Assets            Assets for PL Accounts        NULL            NULL            NULL            NULL            NULL            KWD            CA             Current Account         NULL  NULL         NULL 

(1 row(s) affected) 

companyid companyname          id   idname            level3            level4            level5                                                               currency           accountdefinition         accname           accountno debits         credits 
----------- -------------------------------------------------- ----------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------- --------------------------------------- --------------------------------------- 
101   Fund One Company         1001  Test Fund           Assets            Assets for PL Accounts        NULL            NULL            NULL            NULL            NULL            KWD            CA             Current Account         NULL  NULL         NULL 

(1 row(s) affected) 

companyid companyname          id   idname            level3            level4            level5                                                               currency           accountdefinition         accname           accountno debits         credits 
----------- -------------------------------------------------- ----------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------- --------------------------------------- --------------------------------------- 
101   Fund One Company         1001  Test Fund           Assets            Accounts for MM PL accounts      NULL            NULL            NULL            NULL            NULL            KWD            MPL            PL accounts for MM         NULL  NULL         NULL 

(1 row(s) affected) 

而不是將所有3行顯示爲單個輸出。它將每行顯示爲單個輸出。這在報告級別造成問題。

代碼:

alter PROCEDURE TrialBalance 
(
@companyid INT, 
@id INT    --Input parameter , Studentid of the student 
[email protected] VARCHAR(200) OUT  -- Out parameter declared with the help of OUT keyword 
) 
AS 
BEGIN 
declare @level3 varchar(50),@level4 varchar(50),@level5 varchar(50),@level6 varchar(50),@level7 varchar(50),@level8 varchar(50),@level9 varchar(50),@level10 varchar(50),@level11 varchar(50),@rfrom int,@rto int, 
@companyname varchar(50),@idname varchar(50),@accname varchar(50),@debits decimal(15,3),@credits decimal(15,3),@acno int,@acname varchar(25) 
declare c cursor for SELECT 
level3, 
level4, 
level5, 
level6, 
level7, 
level8, 
level9, 
level10, 
level11, 
rangefrom, 
rangeto 
from linedetails where level1 = @companyid and level2 = @id order by reportlineid 

select @companyname = description from company where companycode = @companyid 
select @idname = description from fundparameters where fundid = @id 


open c 
fetch next from c into @level3,@level4,@level5,@level6,@level7,@level8,@level9,@level10,@level11,@rfrom,@rto 
WHILE @@FETCH_STATUS = 0 
BEGIN 
select @accname = description from accounttype where accounttypeid = @level11 
if @rfrom is not null and @rto is not null 
declare d cursor for select accountno,totaldebitslcy,totalcreditslcy from fund.dbo.account where (accountno >= @rfrom and accountno <= @rto) and currency = @level10 
open d 
fetch next from d into @acno,@debits,@credits 
WHILE @@FETCH_STATUS = 0 
BEGIN 
select @companyid as companyid ,@companyname as companyname ,@id as id ,@idname as idname,@level3 as level3 ,@level4 as level4,@level5 as level5, 
@level6, 
@level7, 
@level8, 
@level9, 
@level10 as currency, 
@level11 as accountdefinition ,@accname as accname,@acno as accountno, @debits as debits,@credits as credits 
fetch next from d into @acno,@debits,@credits 
end 
close d 
deallocate d 
fetch next from c into @level3,@level4,@level5,@level6,@level7,@level8,@level9,@level10,@level11,@rfrom,@rto 
end 
end 
close c 
deallocate c 
+0

我認爲你在做光標循環內的輸出?這可能可以解釋... – 2013-05-07 13:02:49

+0

是的,這是一個問題嗎?否則如何去做? – Nelsons 2013-05-07 13:04:02

+2

顯示程序,我的魔法8球顯示我的機器今天早上壞了。 – 2013-05-07 13:04:11

回答

0

問題在於,您的嵌套遊標中的Select查詢是從一次只能保存單個值的變量中選擇數據的,因此當遊標迭代時,select語句僅爲每次迭代返回一個元組。因此輸出在邏輯上是正確的。

的問題就在這裏:

select @companyid as companyid ,@companyname as companyname ,@id as id ,@idname as  idname,@level3 as level3 ,@level4 as level4,@level5 as level5, 
@level6, @level7,@level8,@level9,Slevel10 as currency,@level11 as accountdefinition @accname as accname,@acno as accountno, @debits as debits,@credits as credits 

相反,創建一個表來從光標和你的光標迭代從該表後,請選擇數據後暫時保存數據。

相反的選擇,寫一個INSERT查詢是這樣的:

insert into tmpTable values(@comapnyid,@companyname,@id,...etc); 

而且,只要你的程序結束前,

select * from tmpTable; 

一件事,

在開始的時候的SP,您可能需要刪除tmpTable,以便表中任何已填充的數據都不會影響當前值。像,

drop table tmpTable; 
+0

順便說一句,你必須首先用你想要的輸出結構創建一個tmpTable。 – 2013-05-07 13:36:03

+0

感謝阿米特的解釋。沒有真正認爲使用遊標會導致這個問題。 – Nelsons 2013-05-07 13:44:10

0

你讓你的遊標循環中的每個運行選擇。這會導致每個循環運行一個單獨的選擇輸出。

如果您希望它們一起在循環外聲明一個臨時表,並在循環中插入結果。

然後在循環結束後選擇該臨時表的所有內容。

+0

謝謝!我這樣做,它的工作。 – Nelsons 2013-05-07 13:42:37