2012-09-28 31 views
1

此更新將失敗,因爲身份證是身份@@ ERROR - 如何在TSQL中處理/評估?

但我收到直接的錯誤消息。
我沒有收到任何PRINT語句。

如何使用@@ ERROR?
使用SSMS。
你會稱之爲腳本還是查詢?

PRINT 'start'; 
DECLARE @ErrorVal INT; 
UPDATE IndenText SET ID = 7; 
SELECT @ErrorVal = @@ERROR; 
PRINT @ErrorVal; 
IF @ErrorVal <> 0 
BEGIN 
    PRINT N'A error caught.'; 
END 
PRINT 'done'; 

這也不起作用從我

PRINT 'start'; 
DECLARE @ErrorVal INT; 
BEGIN TRY 
    UPDATE IndenText SET ID = 7; 
    SELECT @ErrorVal = @@ERROR; 
    PRINT @ErrorVal; 
END TRY 
BEGIN CATCH 
    IF @@ERROR <> 0 
    BEGIN 
     PRINT N'A error caught.' + @@ERROR; 
    END 
END CATCH 
PRINT 'done'; 

我得到
消息8102,級別16,狀態1,4號線 無法更新標識列 'ID'。

正如Martin所說,這是一個編譯錯誤。
創建一個不會是編譯錯誤的約束。
並得到了@@ ERROR來處理。

PRINT 'start'; 
DECLARE @ErrorVal INT; 
DECLARE @newVal INT; 
select @newVal = -1; 
BEGIN TRY 
    update Twaste1 set ID = @newVal ; 
    PRINT 'End Try'; 
END TRY 
BEGIN CATCH 
    Select @ErrorVal = @@ERROR; 
    PRINT 'Begin Catch'; 
    IF @ErrorVal <> 0 
    BEGIN 
     PRINT CAST(@ErrorVal as varchar(30)); 
     PRINT N'A error caught.'; 
    END 
END CATCH 
PRINT 'done' 

;

+0

同意使用try catch的答案。這是批處理或作用域中止錯誤。對於哪些錯誤會中止範圍或者只是任何人能夠辨別AFAIK的聲明沒有特別的邏輯。請參閱[SQL 2000中的錯誤處理](http://www.sommarskog.se/error-handling-I.html#whathappens) –

+0

實際上,在您編輯之後,我意識到這是編譯時錯誤。你甚至無法得到這個估計的執行計劃。編譯時間錯誤只能在編譯主腳本後編譯問題語句時纔可捕獲。通常是因爲它發生在子範圍內,但如果延遲陳述的編譯,也可能發生。 –

+0

@MartinSmith解釋了爲什麼我甚至沒有得到第一個PRINT。正確我甚至不能顯示和估計執行計劃。我需要找到一些會失敗但不是編譯時錯誤的東西。 – Paparazzi

回答

1

我建議使用TRY... CATCH來代替。這將允許您捕獲並檢查拋出的錯誤。

UPDATE:

我相信馬丁已經解釋了爲什麼這並不在他的評論是原來的問題的工作,但我會向MSDN TRY... CATCH文章添加引用:

以下

  • 編譯錯誤,如語法ERRO:類型的錯誤時 它們出現在相同的水平執行的作爲TRY ... CATCH構造不是由CATCH塊處理rs,阻止批處理運行。
  • 語句級別重新編譯期間發生的錯誤,例如編譯後發生的對象名稱解析錯誤,因爲延遲名稱解析爲 。
+0

我仍然得到直接的錯誤。我從SSMS運行這個。 – Paparazzi

2

例如用於更新使用:

UPDATE HumanResources.EmployeePayHistory 
SET PayFrequency = 4 
WHERE BusinessEntityID = 1; 

IF @@ ERROR = 547 PRINT N'A檢查約束衝突發生「。 GO