首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >T-SQL中的打印语句

T-SQL中的打印语句
EN

Stack Overflow用户
提问于 2008-11-06 11:43:09
回答 5查看 297.7K关注 0票数 79

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

EN

回答 5

Stack Overflow用户

发布于 2008-11-06 19:40:21

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

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

在你的应用程序中获得这些消息的方法总是一个好主意,即使你只是假脱机到一个文件,因为当你试图解决一个真正晦涩难懂的问题时,它们总是有用的。然而,我不认为我会希望最终用户看到它们,除非你能保留一个在应用程序中显示内容的信息级别。

票数 39
EN

Stack Overflow用户

发布于 2010-05-28 20:39:31

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

代码语言:javascript
复制
RAISERROR ('Your message', 0, 1) WITH NOWAIT

RAISERROR将仅显示400个字符的消息,并使用与C printf函数类似的语法设置文本格式。

请注意,使用带有with NOWAIT选项的RAISERROR将刷新消息缓冲区,因此还将输出所有以前缓冲的信息。

票数 26
EN

Stack Overflow用户

发布于 2012-06-23 03:24:31

我最近遇到了这个问题,这是因为我在一个null变量上使用了convert语句。由于这会导致错误,因此整个print语句呈现为null,并且根本不打印。

示例-这将失败:

代码语言:javascript
复制
declare @myID int=null
print 'First Statement: ' + convert(varchar(4), @myID)

示例-这将打印:

代码语言:javascript
复制
declare @myID int=null
print 'Second Statement: ' +  coalesce(Convert(varchar(4), @myID),'@myID is null')
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/268384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档