大家帮我看一下这个存储过程出了什么问题!!!???

aliren 2004-10-21 09:20:48
以下是我的存储过程:解决的问题是在注册时如果登陆名存在返回"信息1",如果在插表中途异常出错则返回"信息2",插入成功返回"信息3"..现在的问题是当异常出错时造成调用该存储过程的页面出错..在查询分析器里的报错信息是:

服务器: 消息 3902,级别 16,状态 1,过程 pr_inter_reg,行 62
COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。

是不是我的存储过程存在结构错误问题

create proc pr_inter_reg @cpname nvarchar(40)
as
set nocount on
create table #t (str nvarchar(40))
select * from Tlogname where logname=@cpname
if @@rowcount>0
begin
insert #t select '登陆名存在!' ------信息1
end
else
begin
insert #t select '异常出错!' -------信息2
begin tran inter_insert
insert Tlogname select @cpname
if @@error!=0 or @@rowcount=0 ----Tlogname表中lognid是自增的
begin
rollback tran inter_insert
end
insert Tcompany_user select lognid,@cpname -----Tcompany_user 表
from Tlogname where logname=@cpname
if @@error!=0 or @@rowcount=0
begin
rollback tran inter_insert
end
insert Tcuser_assist select lognid,'n'
from Tlogname where logname=@cpname
if @@error!=0 or @@rowcount=0
begin
rollback tran inter_insert
end
insert Tcuser_bill select lognid,'0',3
from Tlogname
where Tlogname.logname=@cpname
if @@error!=0 or @@rowcount=0
begin
rollback tran inter_insert
end
commit tran inter_insert
update #t set str='注册成功!' ------信息3
end
select str from #t
go
...全文
100 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjui 2004-10-21
  • 打赏
  • 举报
回复
同意归来,加return,还有就是最好不要用临时表,
create proc pr_inter_reg @cpname nvarchar(40)
as
set nocount on
declare @str varchar(200)
select * from Tlogname where logname=@cpname
if @@rowcount>0
begin
set @str='登陆名存在!' ------信息1
end
else
begin
set @str='异常出错!' -------信息2
begin tran inter_insert
insert Tlogname select @cpname
if @@error!=0 or @@rowcount=0 ----Tlogname表中lognid是自增的
begin
rollback tran inter_insert
return
end
insert Tcompany_user select lognid,@cpname -----Tcompany_user 表
from Tlogname where logname=@cpname
if @@error!=0 or @@rowcount=0
begin
rollback tran inter_insert
return
end
insert Tcuser_assist select lognid,'n'
from Tlogname where logname=@cpname
if @@error!=0 or @@rowcount=0
begin
rollback tran inter_insert
return
end
insert Tcuser_bill select lognid,'0',3
from Tlogname
where Tlogname.logname=@cpname
if @@error!=0 or @@rowcount=0
begin
rollback tran inter_insert
return
end
commit tran inter_insert
set @str='注册成功!' ------信息3
end
select @str as str
go
aliren 2004-10-21
  • 打赏
  • 举报
回复
还有就是不管产生了什么异常出错,都会使调用它的页面出错,出错信息其实就是数据库报错信息,有没有解决方法可以不产生错误呢??难道存储过程就是这个样子的吗??
aliren 2004-10-21
  • 打赏
  • 举报
回复
现在又有一个问题,比如我其中一个表的表结构变了,提示错误如下

服务器: 消息 213,级别 16,状态 5,过程 pr_inter_reg,行 44
插入错误: 列名或所提供值的数目与表定义不匹配。
服务器: 消息 266,级别 16,状态 1,过程 pr_inter_reg,行 69
EXECUTE 后的事务计数指出缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。原计数 = 0,当前计数 = 1。

这样好像数据库会打不开
aliren 2004-10-21
  • 打赏
  • 举报
回复
我试试看
LJWS 2004-10-21
  • 打赏
  • 举报
回复
任何一个if 条件成立,都会rollback,然后再继续执行下去,如果还有if成立,那么就没有transaction可以rollback,当然commit也无从说起了,如果rollback后就不想继续执行下去,可以在每个rollback后加上 return ,退出存储过程
aliren 2004-10-21
  • 打赏
  • 举报
回复
LJWS(归来) ,能说清楚点吗??
LJWS 2004-10-21
  • 打赏
  • 举报
回复
顺序执行的概念还没有理解得透

34,593

社区成员

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

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