2008-11-06 139 views
59

为什么T-SQL中的PRINT语句似乎只有时才起作用?使用它有哪些限制?看起来有时候如果生成了一个结果集,它会变成一个空函数,我认为可以防止破坏结果集,但是它的输出可能不会在另一个结果集中出现,比如行数?T-SQL中的PRINT语句

+2

你可以举一些有时打印的代码,有时不打印。我不认为我理解这个问题。 – 2008-11-06 11:46:58

回答

85

那么,如果您有类似以下的语句,您是说没有“打印”结果?

select * from sysobjects 
PRINT 'Just selected * from sysobjects'

如果您使用SQL查询分析器,你会看到有两个选项卡下的底部,其中之一是“消息”,这就是在“打印”报表会显示出来。
如果您担心看到打印报表的时间,你可能想使用类似

raiserror ('My Print Statement', 10,1) with nowait

这会给你的消息立即在达到声明,而不是缓冲的尝试输出,因为查询分析器在大多数情况下都会执行。

+1

很酷的交易。很高兴为你解决这个问题。我通常会告诉查询分析器给我输出文本,以便我可以看到消息内联(Ctrl + T)。请享用! – 2008-11-06 15:03:32

+1

raiserror示例中的10个和1个参数是什么? – 2017-04-13 14:25:43

+0

10,1实际上只是在服务器上说“没什么可看的东西”。请参阅https://docs.microsoft.com/en-us/sql/t-sql/language-elements/raiserror-transact-sql#arguments了解有关它们实际含义的详细信息。 – 2017-04-18 18:09:34

34

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

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

在应用程序中获取这些消息的方法总是一个好主意,即使您只是后台处理文件,因为当您试图追逐一个文件时总会对他们有用处真的很模糊的问题。但是,我不认为我希望最终用户能够看到它们,除非您可以保留在应用程序中显示内容的信息级别。

2

为了读取此问题的其他人的利益,他们的输出中确实缺少了打印语句,实际上存在打印执行但未返回给客户端的情况。我不能具体告诉你他们是什么。我可以告诉你,如果在打印语句之前和之后立即写出语句,你会看到它是否被执行。

21

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

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

RAISERROR只会显示你的信息的400个字符,并使用类似于格式化文本C的printf函数的语法。

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

18

我最近遇到这个问题,结果是因为我有一个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') 
0

你有与这些print语句被输出相关的变量?如果是这样,我发现如果变量没有值,那么print语句不会被输出。