sql2005有个ERROR_MESSAGE()方法可以把异常信息返回
但是ERROR_MESSAGE()在sql2000中不支持我无法返回去了。求解方法

解决方案 »

  1.   

    使用 RAISERROR
    与 PRINT 相比,RAISERROR 在把消息返回给应用程序方面的功能更强大。RAISERROR 能以下列方式中的任意一种返回消息: 已通过 sp_addmessage 系统存储过程添加到 master.dbo.sysmessages 上的由用户定义的错误信息。
    在 RAISERROR 语句中指定的消息字符串。 
    RAISERROR 也有 PRINT 功能的一些扩展: RAISERROR 能够指派一个特定的错误号、严重度和状态。
    RAISERROR 能够请求将错误记入 Microsoft® SQL Server™ 2000 错误日志和 Microsoft Windows NT® 应用程序日志中。
    消息字符串可以包含替代变量和参量,这与 C 语言中的 printf 功能相似。 
    当 RAISERROR 在sysmessages 中与用户定义消息的 msg_id 一同使用时,msg_id 被作为 SQL Server 的错误号码或本机错误代码返回。而当 RAISERROR 与 msg_str 而不是 msg_id 一同使用时,返回的 SQL Server 的错误号和本机错误号为 50000。当使用 RAISERROR 返回一个用户定义的错误信息时,在每个引用该错误的 RAISERROR 中使用不同的状态号码。这可以在发生错误时帮助进行错误诊断。 RAISERROR 可以帮助我们发现并解决 Transact-SQL 代码中的问题、检查数据值或返回包含变量文本的消息。下面的示例在返回给应用程序的消息中替换了 DB_ID 和 DB_NAME 函数的值:DECLARE @DBID INT
    SET @DBID = DB_ID()DECLARE @DBNAME NVARCHAR(128)
    SET @DBNAME = DB_NAME()RAISERROR
       ('The current database ID is:%d, the database name is: %s.',
        16, 1, @DBID, @DBNAME)而以下示例使用由用户定义的消息完成了同样的处理:sp_addmessage 50005, 16,
        'The current database ID is:%d, the database name is: %s.'
    GO
    DECLARE @DBID INT
    SET @DBID = DB_ID()DECLARE @DBNAME NVARCHAR(128)
    SET @DBNAME = DB_NAME()RAISERROR (50005, 16, 1, @DBID, @DBNAME)
    GO第二个 RAISERROR 示例显示,替换参数可以在由用户定义的错误中指定,并且当 RAISERROR 语句执行时由替换参变量填充。
      

  2.   

    create proc p_p1
    @msg varchar(100) output
    as
    declare @err intbegin
        select 1/0
        set @err = @@error
        if @err<>0
        begin
            select top 1 @msg = description
            from dbo.sysmessages
            where error = @err 
                and msglangid = 2052 --中文描述
        end
    end
    godeclare @msg varchar(100)
    exec p_p1 @msg output
    select @msg  --这里只是显示结果验证,如果已经获取到,则可以在程序端获取该输出参数
    go
      

  3.   

    raiserror这个返回是错误代码吧
      

  4.   


    大哥你这个网上贴的吧。。这个在sql2005里不行的 我要一个能在sql2000跟05都不出错的。
      

  5.   

    sql查询语句执行完后添加的异常捕获返回信息
    IF @@ERROR<>0
    BEGIN
       SELECT @ERROR=ERROR_MESSAGE()(这个error不能在sql2000里用了。)
       RETURN @FALSE
    END
    ELSE
    BEGIN
       RETURN @TRUE
    END
      

  6.   

    在2005里
    select description
            from sys.sysmessages
    2000下
    select description
            from sysmessages
      

  7.   

    SELECT @ERROR=ERROR_MESSAGE()(这个error不能在sql2000里用了。)--统一为:
    SELECT @ERROR=@@error
      

  8.   

    谁说的不行create proc p_p1
    @msg varchar(100) output
    as
    declare @err intbegin
        select 1/0
        set @err = @@error
        if @err<>0
        begin
            select top 1 @msg = description
            from dbo.sysmessages
            where error = @err 
                and msglangid = 2052 --中文描述
        end
    end
    godeclare @msg varchar(100)
    exec p_p1 @msg output
    select @msg  --这里只是显示结果验证,如果已经获取到,则可以在程序端获取该输出参数
    go
    /*-----------
    消息 8134,级别 16,状态 1,过程 p_p1,第 7 行
    遇到以零作除数错误。
    ----------------------------------------------------------------------------------------------------
    遇到以零作除数错误。(1 行受影响)
    */
      

  9.   

    为啥我在2005下运行提示
    Msg 2714, Level 16, State 3, Procedure p_p1, Line 11
    数据库中已存在名为 'p_p1' 的对象。
    Msg 8134, Level 16, State 1, Procedure p_p1, Line 7
    遇到以零作除数错误。
    Msg 208, Level 16, State 1, Procedure p_p1, Line 11
    对象名  'dbo.sysmessages' 无效。
    那个'dbo.sysmessages' 无效呢
      

  10.   


    sql2000,貌似只能自己定义。