为什么T-SQL中的PRINT语句似乎有时只能工作?使用它有哪些限制?似乎有时候如果生成了一个结果集,它就变成了一个空函数,我假设它可以防止破坏结果集,但是它的输出是不是可以在另一个结果集中输出,比如行计数?
所以,如果您有类似下面的陈述,那么您说没有"打印"结果?
select * from sysobjects PRINT 'Just selected * from sysobjects'
如果您正在使用SQL查询分析器,您将看到底部有两个选项卡,其中一个是"消息",这就是"打印"语句将显示的位置.
如果你担心的时机看到打印报表,您可能想使用类似尝试
raiserror ('My Print Statement', 10,1) with nowait
这将在到达语句时立即为您提供消息,而不是缓冲输出,因为查询分析器将在大多数情况下执行此操作.
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类上.您会发现严重性和状态等消息上下文信息作为参数传递给回调,因为从系统角度来看,这些消息就像错误一样.
有一种方法可以在应用程序中获取这些消息,即使您只是假脱机到一个文件,因为当您试图追逐一个非常模糊的问题时,总会有一个用途.但是,我不认为我希望最终用户能够看到它们,除非您可以保留显示应用程序中的内容的信息级别.
查询分析器缓冲消息.PRINT和RAISERROR语句都使用此缓冲区,但RAISERROR语句具有WITH NOWAIT选项.要立即打印消息,请使用以下命令:
RAISERROR ('Your message', 0, 1) WITH NOWAIT
RAISERROR只显示400个字符的消息,并使用类似于C printf函数的语法来格式化文本.
请注意,使用带有WITH NOWAIT选项的RAISERROR将刷新消息缓冲区,因此也将输出所有先前缓冲的信息.
我最近碰到了这个,结果是因为我在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')