当前位置:  开发笔记 > 前端 > 正文

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

如何解决《如何在TSQL中刷新PRINT缓冲区?》经验,为你挑选了4个好方法。

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



1> Joel Coehoor..:

使用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


请注意,SQL中的TRY/CATCH只会捕获严重性> 10的错误,因此以这种方式使用RAISERROR不会跳转到CATCH语句中.这很棒,因为这意味着您仍然可以使用TRY/CATCH这样使用RAISERROR.参考:http://msdn.microsoft.com/en-us/library/ms175976.aspx
请注意,这在前500条消息之后不起作用; 一旦你打印超过它突然开始缓冲!

2> Mike..:

在@JoelCoehoorn的答案的基础上,我的方法是保留所有PRINT语句,并简单地用RAISERROR语句跟随它们以引起刷新.

例如:

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

这种方法的优点是PRINT语句可以连接字符串,而RAISERROR则不能.(因此,无论哪种方式,您都拥有相同数量的代码行,因为您必须声明并设置要在RAISERROR中使用的变量).

如果像我一样使用AutoHotKey或SSMSBoost或同等工具,您可以轻松设置快捷方式,例如"] flush",为您输入RAISERROR行.如果每次都是相同的代码行,则可以节省您的时间,即不需要自定义以保存特定文本或变量.


请注意,`RAISERROR()`确实支持`printf()`样式的字符串插值。例如,如果@MyVariableName是一种字符串类型(例如VARCHAR(MAX),NVARCHAR(MAX)等),则可以将RAISERROR()与一行一起使用:RAISERROR(N' MyVariableName:%s',0、1,@ MyVariableName)。

3> tcbrazil..:

是...... 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


查看底部的"消息"选项卡,"结果"选项卡旁边或切换到"结果到文本"模式.

4> 小智..:

另一个更好的选择是不依赖于PRINT或RAISERROR,只需将"print"语句加载到TempDB中的## Temp表或数据库中的永久表中,这将通过另一个窗口中的SELECT语句立即显示数据.这对我来说是最好的.使用永久表也可以作为过去发生的事情的日志.print语句对于错误很方便,但是使用日志表还可以根据特定执行的最后记录值确定确切的故障点(假设您跟踪日志表中的总执行开始时间.)


如果您使用提交和回滚编写真正的事务性脚本,这可能是一个问题.我不相信你能够实时查询你的临时表 - 如果你的交易失败,它就会消失.
推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有