【问题标题】:Using RAISERROR isn't working in SQL Server 2005?使用 RAISERROR 在 SQL Server 2005 中不起作用?
【发布时间】:2010-08-05 12:55:06
【问题描述】:

我有以下代码:

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

但是,RAISERROR 语句不起作用。 raise 错误语句有什么问题?

【问题讨论】:

    标签: sql-server sql-server-2005 stored-procedures


    【解决方案1】:

    发生错误是因为您直接使用 Raiserror(notice single e) 中的函数,所以为了避免这种情况,请尝试以下代码 试试这对我有用

    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;
    

    【讨论】:

    • 不知道,但我已经调试了整个给定的代码,我发现如果我直接放置函数而不是变量,则会出现语法错误
    • 我知道它写在这里。 msdn.microsoft.com/en-us/library/ms177497.aspx#CodeSpippet2。但是RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE())不应该直接工作吗?
    • @TheKing 你不是说Raise Rror吗?
    • @ErikE 我没明白你的意思...我只是说他们为什么不能像 RAISERROR (ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE() ); 之类的声明跨度>
    • @theking 没关系。如果我必须解释它,它已经被毁了。
    【解决方案2】:

    RAISERROR 遵循与任何其他存储过程调用相同的规则。传入的参数必须是常量或变量。您不能直接将函数作为参数传递。有关这方面的文档,请参阅 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
    

    【讨论】:

    • 哦!我认为 RAISEERROR 是一个函数而不是存储过程。
    • 函数不受相同限制。我在答案中附加了一些演示代码来说明差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2011-02-21
    • 2018-11-19
    • 2011-07-25
    • 2010-09-14
    • 1970-01-01
    相关资源
    最近更新 更多