当前位置: 首页 > 面试题库 >

如何在存储过程中获取SQL错误

柯永福
2023-03-14
问题内容

我使用的是SQL Server2005。我创建了一个大多数时候都可以使用的存储过程,但是我发现了一个实例,它无法满足我的要求。

目前,代码执行的操作是这样的

if @@error <> 0
  begin
   select @message_error = "There was a database error adding product "+ @product + " to product line
  end

@message_error输出变量在哪里。

因此,我可以select @@error得到一个数字,但我真正想要的只是SQL错误。

Hey之类的 东西 ,我不能这样做,因为在此列上有fk约束 或其他 约束 。我在msdn
http://msdn.microsoft.com/zh-
cn/library/ms178592(v=sql.90).aspx
上找到了这篇文章

但这只会抛出带有的自定义异常RAISERROR,我不想创建自己的错误消息或异常,我只是想知道为什么东西不起作用。我可以通过Management
Studio执行存储过程,并查看确切的SQL错误,但是尝试匹配站点中的数据并以这种方式手动将其插入很繁琐。

如何将SQL错误文本转换为输出变量?


问题答案:

这是我使用的存储过程模板的一部分:

/*  CREATE PROCEDURE...  */

DECLARE
  @ErrorMessage   varchar(2000)
 ,@ErrorSeverity  tinyint
 ,@ErrorState     tinyint

/*  Additional code  */

BEGIN TRY

/*  Your code here  */

END TRY

BEGIN CATCH
    SET @ErrorMessage  = ERROR_MESSAGE()
    SET @ErrorSeverity = ERROR_SEVERITY()
    SET @ErrorState    = ERROR_STATE()
    RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)

    BREAK
END CATCH

/*  Further cleanup code  */

尝试/捕获块可能很棘手,但比@@
error更详尽。更重要的是,您可以在其中使用各种error_xxx()函数。在这里,我将正确的错误消息与足够的其他数据一起存储在变量@ErrorMessage中,以重新引发该错误。从这里开始,可以使用任意数量的选项。您可以将@ErrorMessage设置为输出变量,测试并处理特定的错误,或者构建自己的错误消息(或调整现有的错误消息以使其更清晰-
您可能会很烦恼地发现自己想要执行此操作的频率)。其他选项将向您展示。

需要注意的事情:在某些情况下,SQL会背对背抛出两个错误消息…并且error_message()只会捕获最后一个错误消息,该消息通常表示诸如“尝试创建对象失败”之类的内容,而真正的错误则在第一条错误消息。这是构建您自己的错误消息的地方。



 类似资料:
  • 问题内容: 我正在尝试将旧的存储过程保存到字符串中。当我使用以下内容时,我不会出现任何换行符。 关于如何获取带有换行符的存储过程文本的任何建议? 我正在考虑使用 谢谢 更新 我正在复制并粘贴结果中的结果,这将显示给我一行。 至于脚本,因为我将结果存储在db字段中。我正在创建一个可以即时生成过程的工具,但是我想创建它们的历史记录。 更新 原来Object_definition可以满足我的要求,但是由

  • 我是MySQL存储过程的新手。不知道为什么我会出现以下错误。请帮我调试一下。 1064年的今天,您的SQL语法出现错误;查看与您的MySQL服务器版本对应的手册,以获得正确的语法,以便在第3行的user_-username=@th'中使用near'作为该用户的id,该用户的全名 表名:user_master 用户id密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密

  • 问题内容: 有没有办法在Teradata存储过程中引发错误? 例如,我要检查表是否为空。如果表为空,则希望使存储过程出错,并显示错误消息“表为空”。 这将使我能够将错误提示给调用应用程序。 问题答案: TD13 +实现了标准SQL的SIGNAL / RESIGNAL 。

  • 问题内容: 我正在编写一个存储过程,需要在该过程中动态构造一个SQL语句以引用传入的表名。 我需要让该SQL语句返回结果,然后可以在整个过程的其余部分中使用它。 我已经尝试过使用临时表和其他所有东西,但是我不断收到一条消息,我需要声明变量等。 例如: 或者… 无论如何,有没有这样做而不使用实际表? 谢谢。 问题答案: 您是否尝试过类似的方法: 您需要确保将nvarchar字符串加N作为前缀,例如。

  • 问题内容: 与PHP中的mysql中的存储过程无关,文档完全缺乏。我目前有一个通过PHP调用的存储过程,如何获取out参数的值? 问题答案: 它看起来像在这篇文章中回答: http://forums.mysql.com/read.php?52,198596,198717#msg-198717 使用mysqli PHP API: 假设sproc myproc(IN i int,OUT j int):