为什么人们在T-SQL中使用RaiseError而不是Print

时间:2012-07-26 09:43:11

标签: sql tsql sql-server-2008-r2

我已尝试过以下两种查询,但它们同时执行。但我仍然看到在许多存储过程中使用的RaiseError而不是print。

查询1:

BEGIN
    WAITFOR DELAY '00:00:03.00'

    PRINT 'DELAY 1 HAS ENDED'

    WAITFOR DELAY '00:00:03.00'

    PRINT 'DELAY 2 HAS ENDED'
END

查询2:

BEGIN
    WAITFOR DELAY '00:00:03.00'

    RAISERROR ('DELAY 1 HAS ENDED', 10,1) WITH NOWAIT

    WAITFOR DELAY '00:00:03.00'

    RAISERROR ('DELAY 2 HAS ENDED', 10,1) WITH NOWAIT

END

两者都只在6秒后给出了所需的输出(我在SQL Server 2008 R2中检查了这一点)

3 个答案:

答案 0 :(得分:5)

RAISERROR优于PRINT的优点是您可以在消息中嵌入变量值,而无需担心CAST和CONVERT。 例如:

 BEGIN
     DECLARE @m int=0
     WAITFOR DELAY '00:00:01.00'
     SET @m+=1;
     RAISERROR ('DELAY %d HAS ENDED', 10,1, @m)

     WAITFOR DELAY '00:00:01.00'

     SET @m+=1;
     RAISERROR ('DELAY %d HAS ENDED', 10,1, @m)

 END

将产生与上述两个示例相同的输出,但在消息中插入变量的值。使用PRINT,您必须这样做:

PRINT 'DELAY ' + CONVERT(VARCHAR(5),@m) + ' HAS ENDED'

......这可能但很麻烦...

答案 1 :(得分:3)

我拥有与您相同的服务器版本,并且查询2在3秒后打印第一个结果(如预期的那样)。您必须在Microsoft SQL Server Management Studio中自行切换到“消息”选项卡才能看到消息。

答案 2 :(得分:1)

我们使用RAISERROR更容易跟踪实际错误。这很方便,因为您可以设置项目的严重性,您可以立即在“消息”部分中查看结果。

PRINT用于一个非常便宜/快速的调试器,在多步骤过程中显示我实际上在实际上期望立即反馈时实际得到的距离。