T-SQL中的PRINT语句


77

为什么T-SQL中的PRINT语句有时仅起作用?使用它有什么限制?似乎有时候,如果生成了一个结果集,它就变成了一个空函数,我假设是要防止破坏结果集,但它的输出不会在其他结果集中消失,例如行数吗?


2
您能否举一些有时可以打印但有时不打印的代码示例。我想我不明白这个问题。
RB。

Answers:


115

因此,如果您有类似以下内容的声明,就是说您没有得到“打印”结果?

从sysobjects中选择*
PRINT'仅从sysobjects中选择*

如果您使用的是SQL查询分析器,则会看到底部有两个选项卡,其中一个是“ Messages”,这就是“ print”语句的显示位置。
如果您担心时间安排看到打印报表,您可能想使用类似尝试

没有等待的raiserror(“我的打印对帐单”,10,1)

这将在到达语句时立即为您提供消息,而不是像大多数情况下的查询分析器一样缓冲输出。


1
太好了。很高兴为您解决了这个问题。我通常告诉查询分析器给我文本输出,以便我可以看到内联消息(Ctrl + T)。请享用!
David T. Macknet

1
raiserror示例中的10和1参数是什么?
乔恩·施耐德

10、1实际上只是对服务器说“没什么可看的”。有关其实际含义的详细信息,请参阅docs.microsoft.com/zh-cn/sql/t-sql/language-elements/…
David T. Macknet

1
当以这种方式使用时,除了计时之外是否RaiseError相同PRINT
FMFF

1
我相信是的。它可能具有立即输出缓冲区的额外好处,因此也会显示其他打印语句,但这是您要验证的内容。我的理解是,它会触发队列立即输出。
David T. Macknet

38

TSQL中的Print语句是一个被误解的生物,可能是由于其名称。实际上,它将消息发送到错误/消息处理机制,然后将其传输到调用应用程序。PRINT很傻。您只能发送8000个字符(4000个Unicode字符)。您可以发送文字字符串,字符串变量(varchar或char)或字符串表达式。如果您使用RAISERROR,那么您只能使用仅2,044个字符的字符串。但是,使用它将信息发送到调用应用程序要容易得多,因为它调用了类似于标准C库中旧printf的格式化函数。除了文本消息外,RAISERROR还可以指定错误号,严重性和状态代码,它还可以用于返回使用sp_addmessage系统存储过程创建的用户定义消息。

尽管消息和错误是如此相似,但是您的错误处理例程对于接收消息没有任何好处。当然,该技术会根据您连接数据库的实际方式(OLBC,OLEDB等)而有所不同。为了接收和处理来自SQL Server数据库引擎的消息,在使用System.Data.SQLClient时,需要创建一个SqlInfoMessageEventHandler委托,以标识处理事件的方法,以侦听InfoMessage事件。在SqlConnection类上。您会发现消息上下文信息(例如严重性和状态)作为参数传递给回调,因为从系统角度来看,这些消息就像错误一样。

即使您只是假脱机到文件,也总是有一种在应用程序中获取这些消息的方法是一个好主意,因为当您试图追逐一个真正晦涩的问题时,它们总是有用的。但是,除非您可以保留在应用程序中显示内容的信息级别,否则我认为我不希望最终用户看到他们。


26

查询分析器缓冲消息。PRINT和RAISERROR语句都使用此缓冲区,但是RAISERROR语句具有WITH NOWAIT选项。要立即打印消息,请使用以下命令:

RAISERROR ('Your message', 0, 1) WITH NOWAIT

RAISERROR将仅显示消息的400个字符,并使用类似于C printf函数的语法来格式化文本。

请注意,将RAISERROR与WITH NOWAIT选项一起使用将刷新消息缓冲区,因此所有先前缓冲的信息也将被输出。


1
RAISERROR语法很痛苦,但是在我的PRINT完成工作后放了一个空的,感谢您提供的信息!
2011年

21

我最近遇到了这个问题,它最终是因为我在null变量上有一个convert语句。因为那会导致错误,所以整个print语句都呈现为null,并且根本不打印。

示例-这将失败:

declare @myID int=null
print 'First Statement: ' + convert(varchar(4), @myID)

示例-这将打印:

declare @myID int=null
print 'Second Statement: ' +  coalesce(Convert(varchar(4), @myID),'@myID is null')

不只是PRINT:在T-SQL中的任何地方使用+运算符以及任何null值都将导致null,无论是否有其他要串联的东西都不为空。使用ISNULL(@myID,'')或COALESCE可以使null可以与字符串连接。
troy

3

为了使其他任何人都读到这个问题,即其输出中确实缺少打印语句,实际上,在某些情况下执行打印但未将打印返回给客户端。我无法具体告诉您它们是什么。我可以告诉您,如果在任何print语句之前和之后立即放置go语句,则如果执行该语句,您将看到它。


我也遇到过这样的情况,即在预期的情况下,打印语句确实会写入消息窗口。在提交或回滚后发生在我身上。
克里斯·辛普森

添加GO语句时刷新我PRINTs到外壳这就是我以后
马特·坎普

0

是否输出了与这些打印语句相关的变量?如果是这样,我发现如果变量没有值,则不会输出打印语句。


您听起来好像不了解NULL使用字符串连接的效果。PRINT 'a' + CAST(NULL AS VARCHAR(MAX));表现完全符合我的预期。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.