4

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

查询一:

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 中检查过)

4

4 回答 4

9

RAISERRORover的优点PRINT是您可以在消息中嵌入变量值,而无需使用CASTand 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'

...这是可能的,但很麻烦...

于 2012-11-12T09:38:10.193 回答
3

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

于 2012-07-26T09:46:56.553 回答
1

我们使用 RAISERROR 来更轻松地跟踪实际错误。这很方便,因为您可以设置项目的严重性,并且您可以立即在“消息”部分看到结果。

PRINT 用于多步骤过程中非常便宜/快速的调试器,它显示了当我实际上并不期望立即获得反馈时我们实际获得了多远。

于 2016-05-20T23:01:37.573 回答
1

有一个返回语句缓冲区导致 PRINT 语句仅在满时刷新(或 SQL Server 设计这样做)。RAISERROR(x, y, z) WITH NOWAIT 要么不使用该缓冲区,要么在添加其消息后似乎强制刷新该缓冲区。

除了这个和 Philippe 在他的回答中提到的嵌入式变量行为之外,低严重性 RAISERROR 和 PRINT 之间似乎没有真正的功能差异。

这是 Louis Davidson (@drsql) 的 2018 年简短帖子,其中包含更多代码示例和其他帖子的链接,其中包含更多详细信息:https ://www.red-gate.com/simple-talk/blogs/outputting-status- t-sql-代码/

至于我,在等待 PRINT 语句通过后,我现在对批处理脚本进度输出使用“RAISERROR(@msg, 0, 42) WITH NOWAIT”。

于 2020-01-06T04:25:01.047 回答