存储过程返回错误信息问题

prettyBoy1 2005-08-23 02:16:11
create procedure prcTest
@sDB varchar(100),@sTableName varchar(100)
as
--说明:字段 员工姓名 为主键字段,不允许空,并且数据库中已经有记录了
--数据库名字@sDB
--表名@sTableName

--把字段ygbh改为not null
set @sSQL='alter table '+@sDb+'..'+@sTableName+' alter
column 员工姓名 varchar(500) not null'
exec (@sSQL)
if @@error<>0
begin
--登记失败的信息
insert bError(name,errornum)('修改字段出错',@@error)
end

然后,我用vb调用该存储过程:exec prcTest 'tempTbStruOld1234567890','员工基本信息表'
当执行到exec (@sSQL)时出错,存储过程会停止执行。然后把错误返回给vb。
系统会提示的错误:“无法将 NULL 值插入列 '员工姓名',表 'tempTbStruOld1234567890.dbo.员工基本信息表';该列不允许空值。UPDATE 失败。”

我的问题是:上面的执行,其实没有执行
if @@error<>0
begin
--登记失败的信息
insert bError(name,errornum)('修改字段出错',@@error)
end
? 如何,执行exec (@sSQL)时,出错了存储过程不返回到vb,将@@error置为非零,并继续执行
if @@error<>0
begin
--登记失败的信息
insert bError(name,errornum)('修改字段出错',@@error)
end


...全文
453 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
prettyBoy1 2005-08-25
  • 打赏
  • 举报
回复
to:啊牛。
你没明白我的意思。


还是不会?
prettyBoy1 2005-08-25
  • 打赏
  • 举报
回复
谢谢 filebat(Mark) 。
你说的对,其实我就是想知道:“系统有没有提供这种功能:判断某条语句是否可以正常执行”
现在我明白了。
filebat 2005-08-25
  • 打赏
  • 举报
回复
你的语句会发生delete等违反完整性约束的运行错误。

这样的话,无论如何你都要预先处理一下啊。

也就是说,在删除时,判断一下该记录是否被其它表参照。

也许,你会想,系统有没有提供这种功能:判断某条语句是否可以正常执行。

没有,至少目前为止,我还没有见到过。
filebat 2005-08-25
  • 打赏
  • 举报
回复
to prettyBoy1(冰鱼):那个示例就是为了显示出错时的处理啊。

出错有两种。编译错误的话,无条件回滚。而如果一条语句发生运行出错的话,它是不会影响到后继语句的执行的。

你可以在删除时判断@@error的值,并决定要不要回滚。
这个我想你也是会的。

如果你不想让它显示出那些出错语句的话,那么就比较麻烦了。
可能修改系统设置的话,可以。
但是完全没有必要啊。

还有一种方法就是在删除前预先判断一下,或是建立一个delete触发器。
prettyBoy1 2005-08-25
  • 打赏
  • 举报
回复
zengzhengliang 2005-08-24
  • 打赏
  • 举报
回复
那是因为这 orderid=10248 这列被 另一个表 引用。
但是并没有建立级联删除。
就提示错误了。
prettyBoy1 2005-08-24
  • 打赏
  • 举报
回复
顶。高手呢?这个问题我觉得挺普遍的。
prettyBoy1 2005-08-23
  • 打赏
  • 举报
回复
to: mark
不行啊。
防到存储过程中一执行,还是提示错误啊,错误信息为:
服务器: 消息 547,级别 16,状态 1,行 1
DELETE 语句与 COLUMN REFERENCE 约束 'FK_Order_Details_Orders' 冲突。该冲突发生于数据库 'Northwind',表 'Order Details', column 'OrderID'。
语句已终止。
filebat 2005-08-23
  • 打赏
  • 举报
回复
你可以这样做, 定义一个int变量@error
在exec (@sSQL)后,就将@@error的值存放在@error中.
这样的话,就不怕@@error这个全局变量被修改了.
然后根据@error的值是不是为0,进行下一步的操作
filebat 2005-08-23
  • 打赏
  • 举报
回复
--你看一下这两个示例吧
--示例1:
use northwind
go
declare @str varchar(100)
set @str='delete orders where orderid=10248'
exec (@str)
if @@error<>0 select @@error
--示例2:
use northwind
go
declare @str varchar(100)
set @str='delete orders where orderid=10248'
exec (@str)
select @@error
select @@error

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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