在线等,此procdure报的是什么错?

时间:2021-08-10 15:35:44
USE [ppscm]
GO
/****** Object:  StoredProcedure [dbo].[exec_yhrzd_sh]    Script Date: 02/26/2010 16:46:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER  procedure  [dbo].[exec_yhrzd_sh]  
@shr   varchar(256),
@shrq  varchar(256),
@yhrzdh    int,
@je        money,
@zhdm      varchar(256)
as 
begin
begin  transaction
declare   @v_shr  varchar(256)
declare   @errno    int,
@errmsg   varchar(256) 


select  @v_shr=yhrzd.shr     from  yhrzd  where  yhrzd.yhrzdh=@yhrzdh

if  @v_shr  is  not  null
begin
select  @errno=13001,
@errmsg='单据已审核,请检查!'
goto  error;

end    

update  yhrzd   
set  shr=@shr,shrq=@shrq
where  yhrzdh=@yhrzdh

if  isnull(@@ROWCOUNT,0)=0
begin
select  @errno=13002,
@errmsg='审核不成功,请检查!'
goto  error        
end 

insert  into  ppscm.dbo.yhyez  (zhdm,zhyezj,zhyejs)  values  (@zhdm,@je,0)

    
update   yhxx  set  yhdm=ISNULL(yhdm,0)+@je   
 where   zhdm=@zhdm  
if  isnull(@@ROWCOUNT,0)=0
begin
select  @errno=13003,
        @errmsg='余额账写得有误,请核对!'
goto  error       
end
error:
raiserror  @errno  @errmsg
rollback  transaction

end;

  这样写。在程序里面调用时,报如下错误:
   消息 2732,级别 16,状态 1,过程 exec_yhrzd_sh,第 49 行
   错误号 0 无效。错误号必须介于 13000 到 2147483647 之间,而且不能是 50000。

6 个解决方案

#1


占用了系统的错误号?
我猜的

#2



--为raiserror指定的错误号无效,参考联机帮助

msg_id
使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消息号。用户定义错误消息的错误号应当大于 50000。如果未指定 msg_id,则 RAISERROR 引发一个错误号为 50000 的错误消息。

msg_str
用户定义消息,格式与 C 标准库中的 printf 函数类似。该错误消息最长可以有 2,047 个字符。如果该消息包含的字符数等于或超过 2,048 个,则只能显示前 2,044 个并添加一个省略号以表示该消息已被截断。请注意,由于内部存储行为的缘故,替代参数使用的字符数比输出所显示的字符数要多。例如,赋值为 2 的代替参数 %d 实际在消息字符串中生成一个字符,但是还会在内部占用另外三个存储字符串。此存储要求减少了可用于消息输出的字符数。

当指定 msg_str 时,RAISERROR 将引发一个错误号为 5000 的错误消息。

#3


要怎么样处理才不报错呢?

#4



--给错误号加个默认值试试。
declare  @errno    int, 
@errmsg  varchar(256) 
set @errno=50000 --加上这句

#5



(1 行受影响)
消息 50000,级别 16,状态 1,过程 exec_yhrzd_sh,第 52 行


加了以后又报这个错啦。
1
没有别的提示了

#6


引用 5 楼 melo_pp 的回复:
(1 行受影响)
消息 50000,级别 16,状态 1,过程 exec_yhrzd_sh,第 52 行


加了以后又报这个错啦。
1
没有别的提示了

是对的噢,之前有错,是因为运行时没进入你的判断,所以你的@errno和@errmsg都没有赋值,都是初始值,int类型的初始值是0,所以在raiserror时就报错了。。
4楼让你加上50000,是为了避免出现这个错误。。说白了。还是你判断有错。因为现在没进任何判断。明白?

#1


占用了系统的错误号?
我猜的

#2



--为raiserror指定的错误号无效,参考联机帮助

msg_id
使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消息号。用户定义错误消息的错误号应当大于 50000。如果未指定 msg_id,则 RAISERROR 引发一个错误号为 50000 的错误消息。

msg_str
用户定义消息,格式与 C 标准库中的 printf 函数类似。该错误消息最长可以有 2,047 个字符。如果该消息包含的字符数等于或超过 2,048 个,则只能显示前 2,044 个并添加一个省略号以表示该消息已被截断。请注意,由于内部存储行为的缘故,替代参数使用的字符数比输出所显示的字符数要多。例如,赋值为 2 的代替参数 %d 实际在消息字符串中生成一个字符,但是还会在内部占用另外三个存储字符串。此存储要求减少了可用于消息输出的字符数。

当指定 msg_str 时,RAISERROR 将引发一个错误号为 5000 的错误消息。

#3


要怎么样处理才不报错呢?

#4



--给错误号加个默认值试试。
declare  @errno    int, 
@errmsg  varchar(256) 
set @errno=50000 --加上这句

#5



(1 行受影响)
消息 50000,级别 16,状态 1,过程 exec_yhrzd_sh,第 52 行


加了以后又报这个错啦。
1
没有别的提示了

#6


引用 5 楼 melo_pp 的回复:
(1 行受影响)
消息 50000,级别 16,状态 1,过程 exec_yhrzd_sh,第 52 行


加了以后又报这个错啦。
1
没有别的提示了

是对的噢,之前有错,是因为运行时没进入你的判断,所以你的@errno和@errmsg都没有赋值,都是初始值,int类型的初始值是0,所以在raiserror时就报错了。。
4楼让你加上50000,是为了避免出现这个错误。。说白了。还是你判断有错。因为现在没进任何判断。明白?