我學會了使用SCOPE_IDENTITY()
而不是僅僅使用@@IDENTITY
來獲取插入給定作用域中的最後一個標識值,這在高併發性場景中非常有用。對於@@ ERROR變量,該函數是否有任何等價物?我的意思是,有沒有什麼辦法,以確保每當我寫SQL Server 2005中的@@ ERROR
IF (@@ERROR <> 0) RETURN
我其實迫使功能,因爲在此範圍內導致錯誤的最後一個命令的返回?
我學會了使用SCOPE_IDENTITY()
而不是僅僅使用@@IDENTITY
來獲取插入給定作用域中的最後一個標識值,這在高併發性場景中非常有用。對於@@ ERROR變量,該函數是否有任何等價物?我的意思是,有沒有什麼辦法,以確保每當我寫SQL Server 2005中的@@ ERROR
IF (@@ERROR <> 0) RETURN
我其實迫使功能,因爲在此範圍內導致錯誤的最後一個命令的返回?
從聯機叢書:
@@ ERROR只產生錯誤的Transact-SQL語句 後立即返回錯誤信息 。
@@錯誤只在當前範圍內。所以它應該具有任何將處理程序發送到catch塊的值,而不管哪個語句是錯誤的。
寫完IF (@@ERROR <> 0)
之後,每一個陳述都不起作用。它需要太多的紀律。你應該移動到BEGIN TRY/BEGIN CATCH
。 Exception handling and nested transactions顯示,可以同時處理異常和嵌套事務的T-SQL程序模式(東西才能使你的T-SQL代碼的強大的考慮):
create procedure [usp_my_procedure_name]
as
begin
set nocount on;
declare @trancount int;
set @trancount = @@trancount;
begin try
if @trancount = 0
begin transaction
else
save transaction usp_my_procedure_name;
-- Do the actual work here
lbexit:
if @trancount = 0
commit;
end try
begin catch
declare @error int, @message varchar(4000), @xstate int;
select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
if @xstate = -1
rollback;
if @xstate = 1 and @trancount = 0
rollback
if @xstate = 1 and @trancount > 0
rollback transaction usp_my_procedure_name;
raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
return;
end catch
end
也看到Error Handling in SQL 2005 and Later進行更深層次的討論,在這個整個主題。