问题描述,在sqlserver2000里,有没有办法获得raiserror后的errormessage?
后来我看了下sysmessages表,里面的description字段里有很多place holder,例如%.*ls,难不成我要自己去替换??查了半天,sqlserver2k里也没有个过的sysmessage的函数,后来sql2k5倒是有了。那我就的自己去解析sysmessages表description字段,有没有哪位兄弟已经解析过的没?比如写个函数,GetSysMessage(errorCode,para1,para2),函数简单点就可以了,参数就定死为2个,但是在sqlserver里,去解析那个sysmessages.description还是超级麻烦啊。
难得发个问题,分全给了,就100分了。
后来我看了下sysmessages表,里面的description字段里有很多place holder,例如%.*ls,难不成我要自己去替换??查了半天,sqlserver2k里也没有个过的sysmessage的函数,后来sql2k5倒是有了。那我就的自己去解析sysmessages表description字段,有没有哪位兄弟已经解析过的没?比如写个函数,GetSysMessage(errorCode,para1,para2),函数简单点就可以了,参数就定死为2个,但是在sqlserver里,去解析那个sysmessages.description还是超级麻烦啊。
难得发个问题,分全给了,就100分了。
raiserror 50005 N'Error'--自定義
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
ERROR_LINE() 會傳回發生錯誤的行號。
ERROR_MESSAGE() 會傳回要傳給應用程式的訊息文字。這些文字包括提供給任何可替代參數的值,例如長度、物件名稱或時間。
ERROR_NUMBER() 會傳回錯誤號碼。
ERROR_PROCEDURE() 會傳回發生錯誤之預存程序或觸發程序的名稱。如果預存程序或觸發程序內並未發生錯誤,此函數會傳回 NULL。
ERROR_SEVERITY() 會傳回嚴重性。
ERROR_STATE() 會傳回狀態。
在執行任何 Transact-SQL 陳述式後,您可以立即使用 @@ERROR 函數來測試是否有錯誤,並擷取錯誤號碼。---------------
2000:
用替代,或自定義(通常都是自定義,不會用系統錯誤信息)
SQLServer 20002005就不用做了。看来只能替代了。
但是需要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)
还是只有替换!!!