如何在TSQL中刷新PRINT缓冲区?

我在SQL Server 2005中有一个非常长时间的存储过程,我正在尝试debugging,并使用'print'命令来执行此操作。 问题是,我只是从我的sproc的末尾从SQL Server获取消息 – 我希望能够刷新消息缓冲区,并在sproc的运行时期间立即看到这些消息,而不是在结束。

使用RAISERROR函数:

 RAISERROR( 'This message will show up right away...',0,1) WITH NOWAIT 

你不应该用raiserror完全replace所有的打印。 如果你在某个地方有一个循环或者大光标,那么每一次迭代就要做一次或者两次,甚至每一次迭代。

另外:我第一次了解到RAISERROR在这个链接,我现在认为SQL Servererror handling的权威来源,绝对值得一读:
http://www.sommarskog.se/error-handling-I.html

是… RAISERROR函数的第一个参数需要一个NVARCHARvariables。 所以试试以下;

 -- Replace PRINT function DECLARE @strMsg NVARCHAR(100) SELECT @strMsg = 'Here''s your message...' RAISERROR (@strMsg, 0, 1) WITH NOWAIT 

要么

 RAISERROR (n'Here''s your message...', 0, 1) WITH NOWAIT 

另一个更好的select是不依赖于PRINT或RAISERROR,只需将您的“打印”语句加载到TempDB的## Temp表中或数据库中的一个永久表中,通过另一个窗口中的SELECT语句使您立即看到数据。 这对我来说是最好的。 使用一张永久性的桌子也可以作为logging过去发生的事情。 打印语句对于错误非常方便,但是使用日志表,您还可以根据该特定执行的最后一个logging值(假设您跟踪日志表中的总体执行开始时间)来确定确切的故障点。

仅供参考, 如果使用脚本(批处理)而不使用存储过程 ,则清除输出由GO命令触发,例如

 print 'test' print 'test' go 

一般来说,我的结论如下:在SMS GUI或sqlcmd.exe中执行的mssql脚本执行的输出在第一个GO语句中刷新到file,stdoutput,gui窗口或直到脚本结束。

在存储过程内部刷新function不同,因为你不能放置内部。

参考: tsql Go语句

以@JoelCoehoorn的答案为基础,我的方法是保留所有的PRINT语句,并简单地使用RAISERROR语句来引起刷新。

例如:

 PRINT 'MyVariableName: ' + @MyVariableName RAISERROR(N'', 0, 1) WITH NOWAIT 

这种方法的优点是PRINT语句可以连接string,而RAISERROR则不能。 (所以无论哪种方式你有相同数量的代码行,因为你必须声明和设置一个variables,以在RAISERROR中使用)。

如果像我一样使用AutoHotKey或者SSMSBoost或者等价的工具,你可以很容易地设置一个快捷方式,例如“] flush”来为你inputRAISERROR行。 如果每次都是同一行代码,那么这样可以节省时间,即不需要自定义来保存特定的文本或variables。