2008-09-24 86 views
0

我需要幫助從SQL Server 2000中的T-SQL記錄錯誤。我們需要記錄我們陷入的錯誤,但是遇到問題時我們會遇到同樣的信息, SQL Server Management Studio。從SQL Server 2000中檢索錯誤文本錯誤

我能得到一個消息沒有任何參數替換這樣的:

SELECT MSG.description from master.dbo.sysmessages MSG 
INNER JOIN sys.syslanguages LANG ON MSG.msglangID=LANG.msglangid 
WHERE [email protected] AND [email protected]@LANGID 

但我還沒有發現找出錯誤論點的任何方式。我希望看到:上表

違反約束MYCONSTRAINT2 MYTABLE7

上表%s的

谷歌搜索

約束衝突%S只止跌回升使用DBCC OutputBuffer中需要管理員權限異國方案並且不適用於生產代碼。如何使用參數替換獲取錯誤消息?

回答

0

你很快就會升級到SQL2005嗎?如果是這樣,你可以利用他們的TRY/CATCH模型來更輕鬆地完成你想要做的事情。

在catch暴露的變量可以給你扔了錯誤的對象,行號,錯誤信息,嚴重程度等在那裏,你可以登錄它,發送電子郵件等

+0

我希望他們升級到2005年!這是我的第一選擇,但不在我的控制之下。 – Clyde 2008-09-24 16:47:28

2

在。淨,(從打印RAISERROR和任何輸出)從SQL Server中檢索錯誤消息是在您的SqlConnection設置一個屬性一樣簡單(.FireInfoMessageEventOnUserErrors =真)和處理連接的InfoMessage事件。 .Net收到的數據與您在SQL Server Management Studio結果網格中的消息窗口中獲得的數據相匹配。

所有的代碼都放在處理事件的函數中,你可以抽象出所有的連接指向相同的方法,所以除了兩行之外,沒有別的可以改變的應用程序的其餘部分代碼在創建新的連接設置屬性和事件(和你有抽象出來,所以你只需要做的是在一個地方,對吧?

這裏是什麼,我考慮definitive error guide for SQL Server的鏈接。
http://www.sommarskog.se/error-handling-I.html

在某些情況下,即使發生錯誤,SQL Server仍會繼續處理。請參閱上一鏈接中標記爲What Happens when an Error Occurs?的標題。

+0

客戶端系統是ASP.NET Web服務。錯誤消息是否在異常中清晰顯示? 在任何情況下,我仍然想從TSQL做到這一點。 1,這將是重構錯誤處理的應用程序的重大修改。 – Clyde 2008-09-24 16:50:35

+0

...和2,有些情況下需要記錄過程中間的錯誤,但錯誤不一定完全會使過程失敗。 如果.NET Sql組件可以構造錯誤消息,是否意味着信息實際上在TSQL中可用? – Clyde 2008-09-24 16:53:41

1

外觀上線圖書RAISERROR(描述)

你會發現語法如下:

RAISERROR ({ msg_id | msg_str } { , severity , state } 
    [ , argument [ ,...n ] ]) 
    [ WITH option [ ,...n ] ] 

和錯誤參數如下:

d or I Signed integer 
o Unsigned octal 
p Pointer 
s String 
u Unsigned integer 
x or X Unsigned hexadecimal 

VB以後的任何語言都有能力捕捉這些語言,並讓您採取適當的行動。

戴夫Ĵ

0

FORMATMESSAGE(它也存在於SQL Server 2000中)允許您從像上面的sysmessages的模板建立信息到他們的最終格式。

但是,RAISERROR命令(這幾乎是數據庫引擎本身在出現錯誤時使用的內部調用)已經發送了可以被捕獲並記錄在客戶端中的完整文本。 SSMS是一個客戶端,不會生成它自己的消息:所有消息都來自數據庫引擎。

但是,我收集你想要使用T-SQL記錄T-SQL錯誤。坦率地說,你不能在SQL Server 2000上。太多的錯誤是批處理和範圍中止以可靠地記錄任何東西。

你必須要SQL Server 2005上使用在客戶端的try/catch/ERROR_MESSAGE,或你的陷阱,然後使用像log4net的重新登錄到SQL Server。