财务对账单 想实现 #TBL 期初以外的行(D=D+B-C) 30fsh1985]

发布时间:2017-2-21 8:50:31 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"财务对账单 想实现 #TBL 期初以外的行(D=D+B-C) 30fsh1985]",主要涉及到财务对账单 想实现 #TBL 期初以外的行(D=D+B-C) 30fsh1985]方面的内容,对于财务对账单 想实现 #TBL 期初以外的行(D=D+B-C) 30fsh1985]感兴趣的同学可以参考一下。

----第一步建表 create table #tbl(A varchar(max) ,B int ,C int,D int ) insert into #tbl values('1',9,4,102) insert into #tbl values('1',1,2,0) insert into #tbl values('1',1,5,0) insert into #tbl values('1',2,5,0) insert into #tbl values('1',3,5,0) insert into #tbl values('1',4,5,0) insert into #tbl values('1',4,7,0) insert into #tbl values('1',4,8,0) insert into #tbl values('1',5,8,0) select * from #tbl -------------------------------第二一下代码  想实现(表#tbl) D=D+B-C  ----------执行下代码会提示 :: --消息 16931,级别 16,状态 1,第 15 行 --当前提取缓冲区内没有行。 declare @num int,@ii int select @num=COUNT(*) from #tbl set @ii=1 declare my_cursor cursor scroll dynamic for  select B,C,D from  #tbl  open my_cursor  declare @a int ,@b int ,@c int ,@aa int ,@bb int,@cc int,@dd int fetch next from my_cursor into @a ,@b ,@c while(@@fetch_status=0)  begin             if @ii=1        set @cc=@c    fetch next from my_cursor into @a ,@b ,@c        update #tbl set D=@cc+@a-@b where current of my_cursor       set @ii=@ii+1    set @cc=@cc+@a-@b end  close my_cursor  deallocate my_cursor  select * from #tbl

把临时表改成实体表

换成实体表一样出错

create table tbl_a(A varchar(max) ,B int ,C int,D int ) insert into tbl_a values('期初',0,0,102) insert into tbl_a values('1',1,2,0) insert into tbl_a values('1',1,5,0) insert into tbl_a values('1',2,5,0) insert into tbl_a values('1',3,5,0) insert into tbl_a values('1',4,5,0) insert into tbl_a values('1',4,7,0) insert into tbl_a values('1',4,8,0) insert into tbl_a values('1',5,8,0) select * from tbl_a -------------------------------第二一下代码 想实现(表tbl_a) D=D+B-C   ----------执行下代码会提示 :: --消息 16931,级别 16,状态 1,第 15 行 --当前提取缓冲区内没有行。 declare @num int,@ii int select @num=COUNT(*) from tbl_a set @ii=1 declare my_cursor cursor scroll dynamic for select B,C,D from tbl_a   open my_cursor   declare @a int ,@b int ,@c int ,@aa int ,@bb int,@cc int,@dd int fetch next from my_cursor into @a ,@b ,@c while(@@fetch_status=0)   begin      if @ii=1     set @cc=@c   fetch next from my_cursor into @a ,@b ,@c      update tbl_a set D=@cc+@a-@b where current of my_cursor      set @ii=@ii+1   set @cc=@cc+@a-@b end   close my_cursor   deallocate my_cursor   select * from tbl_a

直接 update tbl_a set d=d+b-c    这样不行吗

IF OBJECT_ID('tbl_a') IS NOT NULL DROP table tbl_a GO  create table tbl_a(A varchar(10) ,B int ,C int,D int ) insert into tbl_a values('期初',0,0,102) insert into tbl_a values('1',1,2,0) insert into tbl_a values('1',1,5,0) insert into tbl_a values('1',2,5,0) insert into tbl_a values('1',3,5,0) insert into tbl_a values('1',4,5,0) insert into tbl_a values('1',4,7,0) insert into tbl_a values('1',4,8,0) insert into tbl_a values('1',5,8,0) select * from tbl_a -------------------------------第二一下代码 想实现(表tbl_a) D=D+B-C    ----------执行下代码会提示 :: --消息 16931,级别 16,状态 1,第 15 行 --当前提取缓冲区内没有行。 declare @num int,@ii int select @num=COUNT(*) from tbl_a set @ii=1 declare my_cursor cursor scroll dynamic for select B,C,D from tbl_a    open my_cursor    declare @a int ,@b int ,@c int ,@aa int ,@bb int,@cc int,@dd int fetch next from my_cursor into @a ,@b ,@c while(@@fetch_status=0)    begin    if @ii=1    set @cc=@c fetch next from my_cursor into @a ,@b ,@c   if @@fetch_status=0 update tbl_a set D=@cc+@a-@b  where current of my_cursor     set @ii=@ii+1 set @cc=@cc+@a-@b end    close my_cursor    deallocate my_cursor    select * from tbl_a

引用 4 楼 xiao_ai_mei 的回复:SQL code 直接 update tbl_a set d=d+b-c    这样不行吗 不行,效果不是这样,你试试看看,我附近的代码 可以实现但还有点问题

谢谢! 你是加了     if @@fetch_status=0 但我还不明白为什么,可以解释下不? 我那样写怎么就不行

引用 6 楼 fsh1985 的回复:引用 4 楼 xiao_ai_mei 的回复: SQL code 直接 update tbl_a set d=d+b-c 这样不行吗 不行,效果不是这样,你试试看看,我附近的代码 可以实现但还有点问题5楼的

当fetch 后没有记录了, 再update 显然报错。加个判断即可 所以出现你的结果有了,但有个报错

引用 5 楼 xiao_ai_mei 的回复:SQL code IF OBJECT_ID('tbl_a') IS NOT NULL DROP table tbl_a GO  create table tbl_a(A varchar(10) ,B int ,C int,D int ) insert into tbl_a values('期初',0,0,102) insert into tbl_a values('1',1,2,0)…… 我还不明白,你这怎么就可以?  可以说说不?

引用 10 楼 fsh1985 的回复:引用 5 楼 xiao_ai_mei 的回复: SQL code IF OBJECT_ID('tbl_a') IS NOT NULL DROP table tbl_a GO create table tbl_a(A varchar(10) ,B int ,C int,D int ) insert into tbl_a values('期初',0,0,102) insert into…… 这。。。。 原理就是: 当fetch 到最后一条记录时,update最后一条记录,没有问题(之前得也没有问题) 然后while 判断是否提取到记录。此时是提取到的(最后一条记录),所以继续循环, 这时已经没有记录了,所以没有提取到记录, 下面再update ,肯定报错了哦

上一篇:最近数据服务器 被攻击 想架设VPN怎么 能? 40mk30082]
下一篇:SQLServer2008如果做到无故障运行,以及动态扩容? 20xxMix]

相关文章

相关评论