为什么T-SQL中的PRINT语句有时仅起作用?使用它有什么限制?似乎有时候,如果生成了一个结果集,它就变成了一个空函数,我假设是要防止破坏结果集,但它的输出不会在其他结果集中消失,例如行数吗?
Answers:
因此,如果您有类似以下内容的声明,就是说您没有得到“打印”结果?
从sysobjects中选择* PRINT'仅从sysobjects中选择*
如果您使用的是SQL查询分析器,则会看到底部有两个选项卡,其中一个是“ Messages”,这就是“ print”语句的显示位置。
如果您担心时间安排看到打印报表,您可能想使用类似尝试
没有等待的raiserror(“我的打印对帐单”,10,1)
这将在到达语句时立即为您提供消息,而不是像大多数情况下的查询分析器一样缓冲输出。
RaiseError
相同PRINT
?
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类上。您会发现消息上下文信息(例如严重性和状态)作为参数传递给回调,因为从系统角度来看,这些消息就像错误一样。
即使您只是假脱机到文件,也总是有一种在应用程序中获取这些消息的方法是一个好主意,因为当您试图追逐一个真正晦涩的问题时,它们总是有用的。但是,除非您可以保留在应用程序中显示内容的信息级别,否则我认为我不希望最终用户看到他们。
查询分析器缓冲消息。PRINT和RAISERROR语句都使用此缓冲区,但是RAISERROR语句具有WITH NOWAIT选项。要立即打印消息,请使用以下命令:
RAISERROR ('Your message', 0, 1) WITH NOWAIT
RAISERROR将仅显示消息的400个字符,并使用类似于C printf函数的语法来格式化文本。
请注意,将RAISERROR与WITH NOWAIT选项一起使用将刷新消息缓冲区,因此所有先前缓冲的信息也将被输出。
我最近遇到了这个问题,它最终是因为我在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')