求解一存储过程!分不够再加!UP有分!急...在线等.....

openhouse 2005-11-16 02:20:40
if exists (select * from sysobjects where id = object_id(N'[dbo].[CheckBD_P]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure CheckBD_P
GO

create proc CheckBD_P
@TableName char(100)
as
create table #tmp
(employeename char(20))

declare @sqlemp varchar(500)

set @sqlemp ='
insert into #tmp select * from
(
select distinct jbr from '+ @TableName + '
union
select distinct shr from '+ @TableName + '
union
select distinct zgr from '+ @TableName + '
) as a'

exec (@sqlemp)

create table #tmp1
(
employeename char(20),
jbrsfpzzs int ,
jbrsumje decimal(16,2),
jbrbz decimal(16,2),
shrsfpzzs int ,
shrsumje decimal(16,2),
shrjbrbz decimal(16,2),
zgrsfpzzs int ,
zgrsumje decimal(16,2),
zgrjbrbz decimal(16,2)
)

declare @name char(20) --当前凭证中所有的人员名称

declare @sumje decimal(16,2) --当前凭证表中借方金额的总和

--@sumjbr制表人总金额,@sumshr复核人总金额,@sumzgr记账人总金额
declare @sumjbr decimal(16,2) , @sumshr decimal(16,2) ,@sumzgr decimal(16,2)

--@sumjbrpzzs制表人笔数,@sumshrpzzs复核人笔数,@sumzgrpzzs记账人笔数
declare @sumjbrpzzs int ,@sumshrpzzs int,@sumzgrpzzs int

--@sumjejbr制表人比重,@sumjeshr复核人比重,@sumjezgr记账人比重
declare @sumjejbr decimal(16,2),@sumjeshr decimal(16,2) ,@sumjezgr decimal(16,2)

declare @sqlje varchar(500)

set @sqlje='declare @sumje decimal(16,2) select @sumje = sum(jfje) from '+ @TableName

exec (@sqlje)

declare @sql varchar(1000)

declare cur cursor for
select * from #tmp
open cur
fetch next from cur into @name

while @@FETCH_STATUS = 0
begin
set @sql = '
select @sumjbrpzzs=sum(sfpzzs),@sumjbr=sum(jfje),@sumjejbr=(@sumjbr/@sumje)*100
from '+ @TableName + '
where jbr=@name

select @sumshrpzzs=sum(sfpzzs),@sumshr=sum(jfje),@sumjeshr=(@sumshr/@sumje)*100
from '+ @TableName + '
where shr = @name

select @sumzgrpzzs=sum(sfpzzs),@sumzgr=sum(jfje),@sumjezgr=(@sumzgr/@sumje)*100
from '+ @TableName + '
where zgr = @name
insert into #tmp1 values(@name,@sumjbrpzzs,@sumjbr,@sumjejbr,
@sumshrpzzs,@sumshr,@sumjeshr,@sumzgrpzzs,@sumzgr,@sumjezgr)'
print @sql
exec (@sql)
set @sql =''
fetch next from cur into @name
end
select employeename as '人员名称',
jbrsfpzzs as '制表人笔数' ,
jbrsumje as '制表人金额',
jbrbz as '制表人比重(%)',
shrsfpzzs as '复核人笔数' ,
shrsumje as '复核人金额',
shrjbrbz as '复核人比重(%)',
zgrsfpzzs as '记账人笔数' ,
zgrsumje as '记账人金额',
zgrjbrbz as '记账人比重(%)' from #tmp1
close cur
deallocate cur
drop table #tmp
drop table #tmp1

出错消息:
服务器: 消息 137,级别 15,状态 1,行 2
必须声明变量 '@sumjbrpzzs'。
服务器: 消息 137,级别 15,状态 1,行 6
必须声明变量 '@sumshrpzzs'。
服务器: 消息 137,级别 15,状态 1,行 10
必须声明变量 '@sumzgrpzzs'。
服务器: 消息 137,级别 15,状态 1,行 13
必须声明变量 '@name'。
.............等!
...全文
161 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
openhouse 2005-11-16
  • 打赏
  • 举报
回复
那样写是不行的,变量里记录了值!
不过我已经搞定!
结帖!!!!!:)
swordgod 2005-11-16
  • 打赏
  • 举报
回复
set @str='declare @sumjbrpzzs decimal(16,2) select @sumjbrpzzs=...'
swordgod 2005-11-16
  • 打赏
  • 举报
回复
或者把declare写进去
openhouse 2005-11-16
  • 打赏
  • 举报
回复
to : swordgod(阿剑)
这样不行,我的表名是不确定的,而且不能直接使用类似于这样的语句:
select * from @tablename
sql server不允许这样写,所以就要动态的在sql中生成
用select ....into ....也是一样的,表名不固定也得生成语句才行!
swordgod 2005-11-16
  • 打赏
  • 举报
回复
直接用select ... into ...就可以了
swordgod 2005-11-16
  • 打赏
  • 举报
回复
exec ('select @sumjbrpzzs=sum(sfpzzs) from ...')
就会出错,只要不放在exec里执行就可以了
openhouse 2005-11-16
  • 打赏
  • 举报
回复
谁能帮我简单的改一下呀!!!!
急急!!!!
openhouse 2005-11-16
  • 打赏
  • 举报
回复
哦,好的,我试试,大家踊跃一点呀!!!!
wangdehao 2005-11-16
  • 打赏
  • 举报
回复
该声明的地方就得声明啊,以前计算的结果可以先用别的变量保存下来
WangZWang 2005-11-16
  • 打赏
  • 举报
回复
带参数的动态语句执行要用:
execute sp_executesql @sql,N'.......',..
--你可以看一先Online Help
openhouse 2005-11-16
  • 打赏
  • 举报
回复
出错原因:
在set @sql 时因最后生成的语句中没有声明变量,但是有些变量不能声明到这个语句中,因为在这一个语句中有些值是上一次查询时产生的,在这时再次声明的话就会将原值抹掉.不知道应该怎么了,各位大虾们帮帮忙呀!明天要交活的......急,,,,,,
分不够可以再加!!!!!!!
feeling3 2005-11-16
  • 打赏
  • 举报
回复
UP

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧