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