2010-08-05 19 views
7

Tengo el siguiente código a continuación:El uso de RAISERROR no funciona en SQL Server 2005?

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 

Sin embargo, la instrucción RAISERROR no está funcionando. ¿Qué está mal en la declaración de error de aumento?

Respuesta

8

RAISERROR sigue las mismas reglas que cualquier otra llamada de procedimiento almacenado. Los parámetros pasados ​​deben ser una constante o una variable. No puede pasar una función directamente como un parámetro. Consulte Executing Stored Procedures para obtener documentación sobre esto.

/* 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! Pensé que RAISEERROR es una función y no un procedimiento almacenado. – IsmailS

+1

Las funciones no están sujetas a las mismas restricciones. He agregado un código de demostración a mi respuesta para ilustrar la diferencia. –

14

error se produce porque directamente utilizando la función de RaiseError manera de evitar esta prueba el código de abajo Prueba esto está trabajando para mí

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

embargo por qué no podemos utilizar directamente raiserror ... –

+0

no sé, pero tengo que depurar todo dado el código en el que he encontrado que si pongo funciones directamente en lugar de la variable que da error de sintaxis –

+0

Sé que es escrito aquí. http://msdn.microsoft.com/en-us/library/ms177497.aspx#CodeSpippet2. Pero, ¿no deberían funcionar 'RAISERROR (ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE())' directamente? – IsmailS