问题描述,在sqlserver2000里,有没有办法获得raiserror后的errormessage?
后来我看了下sysmessages表,里面的description字段里有很多place holder,例如%.*ls,难不成我要自己去替换??查了半天,sqlserver2k里也没有个过的sysmessage的函数,后来sql2k5倒是有了。那我就的自己去解析sysmessages表description字段,有没有哪位兄弟已经解析过的没?比如写个函数,GetSysMessage(errorCode,para1,para2),函数简单点就可以了,参数就定死为2个,但是在sqlserver里,去解析那个sysmessages.description还是超级麻烦啊。
难得发个问题,分全给了,就100分了。

解决方案 »

  1.   

    楼主意思是要抛出SQL的详细错误?
      

  2.   

    可自定義
    raiserror 50005 N'Error'--自定義
      

  3.   

    RAISERROR(' char: %s;int:', 16, 1, 字符串,100)--如
      

  4.   

    IF @Error <> 0
    BEGIN
    RAISERROR (@Error,16,1)
    RETURN
    END
    IF @Error <> 0
    BEGIN
    DECLARE @strError varchar(1024)
    SET @strError =' XXXX !please check your operation or try again!'
    RAISERROR(@strError,16,1)  
    END
      

  5.   

    05可用在 TRY...CATCH 建構的 CATCH 區塊範圍內,您可以使用下列系統函數: 
    ERROR_LINE() 會傳回發生錯誤的行號。
    ERROR_MESSAGE() 會傳回要傳給應用程式的訊息文字。這些文字包括提供給任何可替代參數的值,例如長度、物件名稱或時間。
    ERROR_NUMBER() 會傳回錯誤號碼。
    ERROR_PROCEDURE() 會傳回發生錯誤之預存程序或觸發程序的名稱。如果預存程序或觸發程序內並未發生錯誤,此函數會傳回 NULL。
    ERROR_SEVERITY() 會傳回嚴重性。
    ERROR_STATE() 會傳回狀態。
    在執行任何 Transact-SQL 陳述式後,您可以立即使用 @@ERROR 函數來測試是否有錯誤,並擷取錯誤號碼。---------------
    2000:
    用替代,或自定義(通常都是自定義,不會用系統錯誤信息)
      

  6.   

    前提:
    SQLServer 20002005就不用做了。看来只能替代了。
      

  7.   

    学习了还是 raiserror errorcode(必须大于50000) N'error message' 这个简单
      

  8.   

    可以在outputbuffer里找到errormessages
    但是需要sysadmin的权限。
    找了个sp如下:
    CREATE PROCEDURE showErrorMessage @errmsg nvarchar(500) OUTPUT AS
        DECLARE @dbccrow nchar(77),
                @msglen  int,
                @lenstr  nchar(2),
                @sql     nvarchar(2000),
                @s       tinyint    -- Catch the output buffer.
        CREATE TABLE #DBCCOUT (col1 nchar(77) NOT NULL)
        INSERT INTO #DBCCOUT
             EXEC ('DBCC OUTPUTBUFFER(@@spid)')    -- Set up a cursor over the table. We skip the first
        -- row, because there is nothing of interest.
        DECLARE error_cursor CURSOR STATIC FORWARD_ONLY FOR
            SELECT col1
            FROM   #DBCCOUT
            WHERE  left(col1, 8) <> replicate('0', 8)
            ORDER  BY col1    -- Init variable, and open cursor.
        SELECT @errmsg  = ''
        OPEN error_cursor
        FETCH NEXT FROM error_cursor INTO @dbccrow    -- On this first row we find the length.
        SELECT @lenstr = substring(@dbccrow, 15, 2)    -- Convert hexstring to int
        SELECT @sql = 'SELECT @int = convert(int, 0x00' + @lenstr + ')'
        EXEC sp_executesql @sql, N'@int int OUTPUT', @msglen OUTPUT    -- @s is where the text part of the buffer starts.
        SELECT @s = 62    -- Now assemble rest of string.
        WHILE @@FETCH_STATUS = 0 AND datalength(@errmsg) - 1 < 2 * @msglen
        BEGIN
          SELECT @errmsg = @errmsg + substring(@dbccrow, @s + 1, 1) +
                                     substring(@dbccrow, @s + 3, 1) +
                                     substring(@dbccrow, @s + 5, 1) +
                                     substring(@dbccrow, @s + 7, 1) +
                                     substring(@dbccrow, @s + 9, 1) +
                                     substring(@dbccrow, @s + 11, 1) +
                                     substring(@dbccrow, @s + 13, 1) +
                                     substring(@dbccrow, @s + 15, 1)
          FETCH NEXT FROM error_cursor INTO @dbccrow
        END    CLOSE error_cursor
        DEALLOCATE error_cursor    -- Now chop first character which is the length, and cut after end.
        SELECT @errmsg = substring(@errmsg, 2, @msglen)
      

  9.   

    现在需要鄙视的是,made,调用这个sp的用户不能给sysadmin的权限,我要撞墙去了。
    还是只有替换!!!