2013-05-07 48 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