我在SQL Server 2005中有一个非常长时间运行的存储过程,我正在尝试调试,而我正在使用'print'命令来执行此操作.问题是,我只是在我的sproc的最后从SQL Server获取消息 - 我希望能够刷新消息缓冲区并在sproc的运行时立即看到这些消息,而不是在结束.
使用RAISERROR
功能:
RAISERROR( 'This message will show up right away...',0,1) WITH NOWAIT
您不应该用raiserror完全替换所有打印件.如果你有一个循环或大光标,只需每次迭代一次或两次,甚至每次迭代.
另外:我首先在这个链接上了解了RAISERROR,我现在认为它是SQL Server错误处理的权威来源,绝对值得阅读:http:
//www.sommarskog.se/error-handling-I.html
在@JoelCoehoorn的答案的基础上,我的方法是保留所有PRINT语句,并简单地用RAISERROR语句跟随它们以引起刷新.
例如:
PRINT 'MyVariableName: ' + @MyVariableName RAISERROR(N'', 0, 1) WITH NOWAIT
这种方法的优点是PRINT语句可以连接字符串,而RAISERROR则不能.(因此,无论哪种方式,您都拥有相同数量的代码行,因为您必须声明并设置要在RAISERROR中使用的变量).
如果像我一样使用AutoHotKey或SSMSBoost或同等工具,您可以轻松设置快捷方式,例如"] flush",为您输入RAISERROR行.如果每次都是相同的代码行,则可以节省您的时间,即不需要自定义以保存特定文本或变量.
是...... RAISERROR函数的第一个参数需要一个NVARCHAR变量.所以尝试以下方法;
-- 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
另一个更好的选择是不依赖于PRINT或RAISERROR,只需将"print"语句加载到TempDB中的## Temp表或数据库中的永久表中,这将通过另一个窗口中的SELECT语句立即显示数据.这对我来说是最好的.使用永久表也可以作为过去发生的事情的日志.print语句对于错误很方便,但是使用日志表还可以根据特定执行的最后记录值确定确切的故障点(假设您跟踪日志表中的总执行开始时间.)