为什么T-SQL中的PRINT语句似乎有时只能工作?使用它有哪些限制?似乎有时候如果生成了一个结果集,它就变成了一个空函数,我假设它可以防止破坏结果集,但是它的输出是不是可以在另一个结果集中输出,比如行数?
答案 0 :(得分:94)
所以,如果您有类似以下内容的陈述,那么您说没有“打印”结果?
select * from sysobjects PRINT 'Just selected * from sysobjects'
如果您正在使用SQL查询分析器,您会看到底部有两个选项卡,其中一个是“消息”,这就是“打印”语句将显示的位置。
如果您担心看到打印语句的时间,您可能想尝试使用类似
raiserror ('My Print Statement', 10,1) with nowait
这将在到达语句时立即为您提供消息,而不是缓冲输出,因为查询分析器将在大多数情况下执行此操作。
答案 1 :(得分:36)
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类上。您会发现消息上下文信息(例如severity和state)作为参数传递给回调,因为从系统角度来看,这些消息就像错误一样。
在你的应用程序中有一种获取这些消息的方法总是一个好主意,即使你只是假脱机到一个文件,因为当你试图追逐一个真正的东西时总会有一个用途。模糊的问题。但是,我不认为我希望最终用户能够看到它们,除非您可以保留显示应用程序内容的信息级别。
答案 2 :(得分:25)
查询分析器缓冲消息。 PRINT和RAISERROR语句都使用此缓冲区,但RAISERROR语句具有WITH NOWAIT选项。要立即打印消息,请使用以下命令:
RAISERROR ('Your message', 0, 1) WITH NOWAIT
RAISERROR只会显示400个字符的消息,并使用类似于C printf函数的语法来格式化文本。
请注意,使用带有WITH NOWAIT选项的RAISERROR将刷新消息缓冲区,因此所有先前缓冲的信息也将被输出。
答案 3 :(得分:20)
我最近碰到了这个,最后因为我在null变量上有一个转换语句。由于这会导致错误,因此整个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')
答案 4 :(得分:3)
为了读取此问题的任何其他人的好处,实际上缺少输出中的打印语句,实际上存在打印执行但不返回给客户端的情况。我不能具体告诉你它们是什么。我可以告诉你,如果在任何print语句之前和之后立即发出go语句,你会看到它是否被执行。
答案 5 :(得分:0)
您是否输出了与这些打印语句关联的变量?如果是这样,我发现如果变量没有值,那么print语句将不会被输出。