2010-08-05 16 views
7

Aşağıdaki kod aşağıdadır:RAISERROR kullanımı SQL Server 2005'te çalışmıyor mu?

BEGIN TRY 

    BEGIN TRANSACTION 
     -- DO SOMETHIING 

    COMMIT TRAN 

END TRY 
BEGIN CATCH 
    IF(@@TRANCOUNT > 0) 
    ROLLBACK TRANSACTION 

    RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE()) --ERROR: Incorrect syntax near 'ERROR_MESSAGE'. 

END CATCH 

Ancak, RAISERROR ifadesi çalışmıyor. Yükseltme hatası bildirisinde sorun nedir?

cevap

8

RAISERROR başka saklı yordam çağrısı kuralları aynıdır benim için çalışıyor. Geçirilen parametreler sabit veya değişken olmalıdır. Bir işlevi doğrudan parametre olarak geçemezsiniz. Bunun ile ilgili belgeler için bkz. Executing Stored Procedures.

/* Demo Code - Functions accept functions as parameters 
       while stored procedures do not    */ 

create function dbo.fnDayOfWeek 
    (@date datetime) 
    returns int 
as 
begin 
    declare @x int 
    set @x = DATEPART(day,@date) 
    return (@x) 
end 
go 

/* Both statements are successful */ 
select dbo.fnDayOfWeek('2010-08-06') 
go 
select dbo.fnDayOfWeek(GETDATE()) 
go 

drop function dbo.fnDayOfWeek 
go 

create procedure DayOfWeek 
    @date datetime 
as 
begin 
    select DATEPART(day,@date) 
end 
go 

/* First call succeeds, second fails */ 
exec DayOfWeek @date = '2010-08-06' 
go 
exec DayOfWeek @date = getdate() 
go 

drop procedure DayOfWeek 
go 
+0

Oh! RAISEERROR'un bir işlev olduğunu ve saklı yordam olmadığını düşündüm. – IsmailS

+1

İşlevler aynı kısıtlamalara tabi değildir. Farkı göstermek için cevabıma bazı demo kodu ekledim. –

14

Hata oluştuğu bu

BEGIN CATCH 
    DECLARE @ErrorMessage NVARCHAR(4000); 
    DECLARE @ErrorSeverity INT; 
    DECLARE @ErrorState INT; 

    SELECT 
     @ErrorMessage = ERROR_MESSAGE(), 
     @ErrorSeverity = ERROR_SEVERITY(), 
     @ErrorState = ERROR_STATE(); 

    RAISERROR (@ErrorMessage, -- Message text. 
       @ErrorSeverity, -- Severity. 
       @ErrorState -- State. 
       ); 
END CATCH; 
+1

Ama neden doğrudan ... –

+0

do not biliyorum ama ben işlevlerini yerine doğrudan değişken koyarsanız bildiğim sözdizimi hatası –

+0

verdiğini buldum ki kod verilen ayıklama bütünü var RAISERROR kullanamaz onun burada yazılmıştır. http://msdn.microsoft.com/en-us/library/ms177497.aspx#CodeSpippet2. Ancak RAISERROR (ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE()) doğrudan çalışmaz mı? – IsmailS