此更新將失敗,因爲身份證是身份@@ 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'
;
同意使用try catch的答案。這是批處理或作用域中止錯誤。對於哪些錯誤會中止範圍或者只是任何人能夠辨別AFAIK的聲明沒有特別的邏輯。請參閱[SQL 2000中的錯誤處理](http://www.sommarskog.se/error-handling-I.html#whathappens) –
實際上,在您編輯之後,我意識到這是編譯時錯誤。你甚至無法得到這個估計的執行計劃。編譯時間錯誤只能在編譯主腳本後編譯問題語句時纔可捕獲。通常是因爲它發生在子範圍內,但如果延遲陳述的編譯,也可能發生。 –
@MartinSmith解釋了爲什麼我甚至沒有得到第一個PRINT。正確我甚至不能顯示和估計執行計劃。我需要找到一些會失敗但不是編譯時錯誤的東西。 – Paparazzi