alter procedure Upd_PerMT
(@Cid varchar(4),
@MtdStartYear int,
@beginmonth int)
as
declare @MtdCol nvarchar(20),@strSql nvarchar(1000)
declare @strAcctNoBE nvarchar(100)
declare @strAcctName nvarchar(100)
declare @strCriteriaClassify nvarchar(100)
declare @intClassify int
set @beginmonth=4while (@beginmonth<=12)
begin
set @MtdCol = 'mtd'+cast(@MtdStartYear as nvarchar) + convert(nvarchar,RIGHT(100+@beginmonth,2))
DECLARE perMT_Cursor CURSOR FOR
SELECT AcctNoBE, AcctName, CriteriaClassify, Classify
FROM RPT_resultA41_perMT
where companyId = @Cid
order by acctNoBe
OPEN perMT_Cursor
FETCH NEXT FROM perMT_Cursor into
@strAcctNoBE, @strAcctName, @strCriteriaClassify, @intClassify
IF (@@FETCH_STATUS <> 0)
BEGIN
BREAK
END
set @strSql = 'update d set d.' + @MtdCol +'= (
select SUM(' + @MtdCol + ') / ' +
' (select a.SalesVolume from f_salesvolumeuser a inner join D_FiscalDate b
on a.FiscalDateID = b.FiscalDateID
and a.companyid = b.companyid
where b.fromdateString =''' + cast(@MtdStartYear as nvarchar) + convert(nvarchar,RIGHT(100+@beginmonth,2)) + '01'''+
' and a.CompanyID ='+LTRIM(@Cid)+'
)
from rpt_resultA41 c
where c.'+ @strCriteriaClassify +
' and c.CompanyID ='+LTRIM(@Cid)+'
)
from rpt_resultA41 d
where d.classify = 0
and d.CompanyID ='+LTRIM(@Cid)+'
and d.acctnobe ='''+@strAcctNoBE+''''
FETCH NEXT FROM perMT_Cursor into
@strAcctNoBE, @strAcctName, @strCriteriaClassify, @intClassify
print (@strsql)
exec (@strSql)
CLOSE perMT_Cursor
DEALLOCATE perMT_Cursor
set @beginmonth=@beginmonth+1
end大家看得出from rpt_resultA41 c
where c.'+ @strCriteriaClassify +
' and c.CompanyID ='+LTRIM(@Cid)+'
)
from rpt_resultA41 d
where d.classify = 0
and d.CompanyID ='+LTRIM(@Cid)+'
and d.acctnobe ='''+@strAcctNoBE+''''
中的where c.'+ @strCriteriaClassify +和这个and d.acctnobe ='''+@strAcctNoBE+''''没有改变吗?参数是对的,是循环的问题,大家帮忙看看
解决方案 »
- 最近数据库老是死锁,系统老是写不进数据,或者很多用户,只有某部分用户才能输入,正在想,是不是程序中用了一些语句把某些表给锁死了呢?
- 想了很久没想出来!麻烦大家帮个忙!
- 附加数据库时 未能打开新数据库
- sql语句的问题
- 我的一个for delete触发器在 企业管理器显示为红色的小叉是什么意思?
- 445端口一关,客户端就无法连接到数据库,SQL数据库与445端口有何关系?
- 我的系统是繁体版的,装了一下金山快议简体版,装完后未重启,之后卸载,重启,装sql,不能装,错误原因是有个搁置文件,该如何解决??
- 哪位师兄给指些数据库基础的资料,什么联合 主键 外键 事务 我都部懂 只知道简单的SQL语句,分数部多,请别嫌弃,谢谢了。
- 一个关于SQL SERVER 存储过程的问题。
- 求一个sql语句
- win7系统下,装哪个版本的SQL server最好啊?
- 如何合并两个表的相同列?
下班了 自己慢慢看
IF (@@FETCH_STATUS <> 0)
BEGIN
BREAK
END
这儿有问题
@strAcctNoBE, @strAcctName, @strCriteriaClassify, @intClassify
print (@strsql)
exec (@strSql)走到这里 游标指向下一行 下面的print还执行不啊 对游标理解不深 如果不是往下执行print继续循环游标的话 那肯定取的是最后一个记录了 那@strAcctNoBE, @strAcctName, @strCriteriaClassify, @intClassify的值在整个while循环里肯定不会变啊 都是取的这个表 RPT_resultA41_perMT 对应返回结果的最后一条记录啊 这样的话 这么循环的没道理。。不知说的对不对
if(object_id('t1') is not null)drop table t1
CREATE table t1(
id int identity(1,1) primary key,
value nvarchar(20)
)
go
--插入测试数据
insert into t1(value)
select '值1'union all
select '值2'union all
select '值3'union all
select '值4'
--查看结果集合
--select * from t1
if(OBJECT_ID('p_print')is not null) drop procedure p_print
go
create procedure p_print
as
begin
declare @value nvarchar(20)--注意这里的变量类型应该与游标中读取出来的字段类型相同
--创建游标
declare cur1 cursor for
select value from t1
--打开游标
open cur1
fetch next from cur1 into @value--这里的@value对应游标每条记录中的字段value的值
while(@@FETCH_STATUS = 0)
begin
print 'value:'+@value
fetch next from cur1 into @value
end
--关闭游标
close cur1
--释放游标
DEALLOCATE cur1
end
--调用(去注释调用)
--exec p_print
/* 执行结果
value:值1
value:值2
value:值3
value:值4
*/
FETCH NEXT FROM perMT_Cursor into
@strAcctNoBE, @strAcctName, @strCriteriaClassify, @intClassify
declare @pid int
set @pid=1
while(@pid<=(select COUNT(*)from dbo.RPT_resultA41_perMT))
begin
IF (@@FETCH_STATUS <> 0)
BEGIN
BREAK
END
set @strSql = 'update d set d.' + @MtdCol +'= (
select SUM(' + @MtdCol + ') / ' +
' (select a.SalesVolume from f_salesvolumeuser a inner join D_FiscalDate b
on a.FiscalDateID = b.FiscalDateID
and a.companyid = b.companyid
where b.fromdateString =''' + cast(@MtdStartYear as nvarchar) + convert(nvarchar,RIGHT(100+@beginmonth,2)) + '01'''+
' and a.CompanyID ='+LTRIM(@Cid)+'
)
from rpt_resultA41 c
where c.'+ @strCriteriaClassify +
' and c.CompanyID ='+LTRIM(@Cid)+'
)
from rpt_resultA41 d
where d.classify = 0
and d.CompanyID ='+LTRIM(@Cid)+'
and d.acctnobe ='''+@strAcctNoBE+''''
FETCH NEXT FROM perMT_Cursor into
@strAcctNoBE, @strAcctName, @strCriteriaClassify, @intClassify
print (@strsql)
exec (@strSql)
end这部分这样写成功了,可是是蒙的,不了解格式什么的,还待学习
嗯 这样循环确实就对了 while条件 直接写 while 1=1 就行了 不用一条查询语句 无实际意义
昨天的这个 @beginmonth 我以为是啥呢 也没啥用的啊
那@beginmonth有用,本来有两个循环的,只是我不全放,怕代码长看到大家烦,就放一个了,哈哈
全文
CREATE procedure [dbo].[Upd_PerMT]
(@Cid varchar(4),
@MtdStartYear int,
@beginmonth int)
as
declare @MtdCol nvarchar(20),@strSql nvarchar(1000)
declare @strAcctNoBE nvarchar(100)
declare @strAcctName nvarchar(100)
declare @strCriteriaClassify nvarchar(100)
declare @intClassify int
set @beginmonth=4while (@beginmonth<=12)
begin
set @MtdCol = 'mtd'+cast(@MtdStartYear as nvarchar) + convert(nvarchar,RIGHT(100+@beginmonth,2))
DECLARE perMT_Cursor CURSOR FOR
SELECT AcctNoBE, AcctName, CriteriaClassify, Classify
FROM RPT_resultA41_perMT
where companyId = @Cid
order by acctNoBe
OPEN perMT_Cursor
FETCH NEXT FROM perMT_Cursor into
@strAcctNoBE, @strAcctName, @strCriteriaClassify, @intClassify
declare @pid int
set @pid=1
while(@pid<=(select COUNT(*)from dbo.RPT_resultA41_perMT))
begin
IF (@@FETCH_STATUS <> 0)
BEGIN
BREAK
END
set @strSql = 'update d set d.' + @MtdCol +'= (
select SUM(' + @MtdCol + ') / ' +
' (select a.SalesVolume from f_salesvolumeuser a inner join D_FiscalDate b
on a.FiscalDateID = b.FiscalDateID
and a.companyid = b.companyid
where b.fromdateString =''' + cast(@MtdStartYear as nvarchar) + convert(nvarchar,RIGHT(100+@beginmonth,2)) + '01'''+
' and a.CompanyID ='+LTRIM(@Cid)+'
)
from rpt_resultA41 c
where c.'+ @strCriteriaClassify +
' and c.CompanyID ='+LTRIM(@Cid)+'
)
from rpt_resultA41 d
where d.classify = 0
and d.CompanyID ='+LTRIM(@Cid)+'
and d.acctnobe ='''+@strAcctNoBE+''''
FETCH NEXT FROM perMT_Cursor into
@strAcctNoBE, @strAcctName, @strCriteriaClassify, @intClassify
print (@strsql)
exec (@strSql)
end
CLOSE perMT_Cursor
DEALLOCATE perMT_Cursor
set @beginmonth=@beginmonth+1
end
GO谢谢您啦