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

Vai*_*hav 2 sql t-sql 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
Run Code Online (Sandbox Code Playgroud)

查询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
Run Code Online (Sandbox Code Playgroud)

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

Phi*_*emy 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
Run Code Online (Sandbox Code Playgroud)

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

PRINT 'DELAY ' + CONVERT(VARCHAR(5),@m) + ' HAS ENDED'
Run Code Online (Sandbox Code Playgroud)

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

  • “RAISERROR”的另一个优点是您可以添加“WITH NOWAIT”选项:然后您可以立即在 sqlserver Management Studio 的“消息”选项卡中获取消息,而不必等待消息缓冲区填满:这很有用在长时间运行的查询中。确实,在大约 30 秒以下的简短查询中,人们可能看不到“WITH NOWAIT”的效果。同样,一段时间后,“WITH NOWAIT”的效果结束,输出再次被缓冲(约 50 Kb 的消息)。但这并不影响 SQLCMD 的行为...... (2认同)

Sco*_*hic 4

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

  • +1 消息选项卡不会自动切换到查询 6 秒结束,但“RAISERROR”仍会在 3 秒后打印第一条消息。在 2008 R2 上测试。 (3认同)