T-SQL中的PRINT语句
为什么T-SQL中的PRINT语句似乎只有一些工作? 有什么限制使用它? 看起来有时候,如果生成一个结果集,它会变成一个空函数,我认为,以防止损坏的结果集,但它的输出不能出去在另一个结果集,如行数?
那么,如果你有一个像下面这样的陈述,你是说没有“印刷”结果?
从sysobjects中select* 打印'刚刚select*从sysobjects'
如果你使用的是SQL查询分析器,你会发现底部有两个标签,其中一个是“Messages”,这就是'print'语句显示的地方。
如果你担心看到打印报表的时间,你可能想尝试使用类似的东西
raiserror('我的印刷声明',10,1)与nowait
这会在语句达到时立即为您提供消息,而不是缓冲输出,因为查询分析器将在大多数情况下执行。
TSQL中的Print语句是一个误解的生物,可能是因为它的名字。 它实际上会向错误/消息处理机制发送消息,然后将消息传送给调用应用程序。 打印是非常愚蠢的。 您只能发送8000个字符(4000个Unicode字符)。 您可以发送一个string,一个stringvariables(varchar或char)或一个stringexpression式。 如果你使用RAISERROR,那么你仅限于一个只有2,044个字符的string。 但是,使用它向调用应用程序发送信息要容易得多,因为它调用了与标准C库中的旧printf相似的格式化函数。 除了文本消息外,RAISERROR还可以指定错误编号,严重级别和状态代码,还可以用于返回使用sp_addmessage系统存储过程创build的用户定义消息。 您也可以强制logging消息。
尽pipe消息和错误非常相似,但是您的error handling例程对于接收消息来说不会有任何好处。 当然,根据连接到数据库的实际方式(OLBC,OLEDB等),技术也会有所不同。 为了接收和处理来自SQL Server数据库引擎的消息,当您使用System.Data.SQLClient时,您需要创build一个SqlInfoMessageEventHandler委托,标识处理该事件的方法,以侦听InfoMessage事件在SqlConnection类上。 您会发现,严重性和状态等消息上下文信息作为parameter passing给callback函数,因为从系统angular度来看,这些消息就像错误一样。
在应用程序中获取这些消息总是一个好主意,即使您只是将文件后台打印到一个文件中,因为当您尝试追查一个非常模糊的问题时,总会对他们有用处。 然而,我想不出最终用户会看到他们,除非您可以保留在应用程序中显示内容的信息级别。
查询分析器缓冲消息。 PRINT和RAISERROR语句都使用此缓冲区,但RAISERROR语句具有WITH NOWAIT选项。 要立即打印消息,请使用以下命令:
RAISERROR ('Your message', 0, 1) WITH NOWAIT
RAISERROR将仅显示400个字符的消息,并使用类似于C printf函数的语法来格式化文本。
请注意,使用带有NOWAIT选项的RAISERROR将刷新消息缓冲区,因此所有以前缓冲的信息也将被输出。
我最近碰到这个,最后是因为我有一个nullvariables的转换语句。 由于这是导致错误,整个打印语句呈现为空,而不是打印。
示例 – 这将失败:
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')
为了读取这个问题的任何人的利益,真正缺less输出的打印语句,实际上有打印执行但不返回给客户端的情况。 我不能具体告诉你他们是什么。 我可以告诉你,如果在打印语句之前和之后立即使用go语句,你会看到它是否被执行。
你有与这些打印语句相关联的variables输出吗? 如果是这样,我发现如果variables没有值,那么print语句将不会被输出。
我刚刚发生这种情况。 我的问题是我的stringvariables中有一个datevariables。 当我去打印string,它不会打印,也不会给我一个错误消息。
我基本上把datevariables转换成我的stringvariables中的string。 然后它打印好!