2011-06-06 40 views
3

我學會了使用SCOPE_IDENTITY()而不是僅僅使用@@IDENTITY來獲取插入給定作用域中的最後一個標識值,這在高併發性場景中非常有用。對於@@ ERROR變量,該函數是否有任何等價物?我的意思是,有沒有什麼辦法,以確保每當我寫SQL Server 2005中的@@ ERROR

IF (@@ERROR <> 0) RETURN

我其實迫使功能,因爲在此範圍內導致錯誤的最後一個命令的返回?

回答

6

從聯機叢書:

@@ ERROR只產生錯誤的Transact-SQL語句 後立即返回錯誤信息 。

@@錯誤只在當前範圍內。所以它應該具有任何將處理程序發送到catch塊的值,而不管哪個語句是錯誤的。

5

寫完IF (@@ERROR <> 0)之後,每一個陳述都不起作用。它需要太多的紀律。你應該移動到BEGIN TRY/BEGIN CATCHException 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進行更深層次的討論,在這個整個主題。