Sql server 使用SQL“消息”窗格的结果

Sql server 使用SQL“消息”窗格的结果,sql-server,sql-server-2005,ssms,Sql Server,Sql Server 2005,Ssms,我有一个现有的SQL 2005存储过程,出于某种原因,它将结果输出到SSMS的消息窗格中,而不是结果窗格中。它实际上是一个CLR过程,已经编译并部署到我们所有的服务器上,并用于另一个日常进程。所以我不能改变它,我只想使用它的输出 为了便于讨论,这里有一个行为方式相同的存储过程: CREATE PROCEDURE [dbo].[OutputTest] @Param1 int, @Param2 varchar(100) AS BEGIN SET NOCOUNT ON; P

我有一个现有的SQL 2005存储过程,出于某种原因,它将结果输出到SSMS的消息窗格中,而不是结果窗格中。它实际上是一个CLR过程,已经编译并部署到我们所有的服务器上,并用于另一个日常进程。所以我不能改变它,我只想使用它的输出

为了便于讨论,这里有一个行为方式相同的存储过程:

CREATE PROCEDURE [dbo].[OutputTest] 
    @Param1  int, @Param2 varchar(100)
AS
BEGIN
    SET NOCOUNT ON;
    PRINT 'C,10000,15000';
    PRINT 'D,30000,90000';
    PRINT 'E,500,50000';
END
因此,这里没有实际的SELECT语句,如果运行该语句,则只能在消息窗格中看到这些结果

我有没有办法将这些结果作为更大查询的一部分使用?把它们放在临时表格里,这样我就能把它们解析出来了

正常的东西都不起作用,因为这里没有真正的输出:

INSERT INTO #output
EXEC OutputTest 100, 'bob'
只是显示

C,10000,15000
D,30000,90000
E,500,50000

(0 row(s) affected)

在消息窗格上,“临时表”实际上并没有得到任何东西。

我不认为有办法,但即使我认为你应该认真考虑它是否是个好主意。这听起来像是一种软糖,只会长期给你带来痛苦。在我看来,创建一个完全符合您要求的替代程序似乎是一个更好的计划

无法从结果中的消息窗格中获取消息。 如果你想一想,SSMS只是一个客户端,它以你所看到的方式解析这些消息


如果您想在应用程序中使用它们,请看一看

,我认为唯一可行的方法是通过RAISERROR命令打印输出。在这种情况下,您可以使用TRY/CATCH在别处捕获它


但这只是一个想法:我从来没有做过。事实上,我们所做的唯一远程接近的事情是,我们有一个命令行工具来在批处理作业中运行存储过程,而不是使用sql server代理来调度它们。这样,我们所有的夜间作业都安排在一个位置,即windows任务调度器,而不是两个,命令行工具将打印到消息窗口的任何内容捕获到我们监视的通用日志系统中。因此,一些过程将向该窗口输出大量细节。

您能从C代码执行存储的过程吗?如果是这样,您可能能够挂接到名为SqlInfoMessage的SqlCommand事件:

SqlConnection _con = new SqlConnection("server=.;
            database=Northwind;integrated Security=SSPI;");

_con.InfoMessage += new SqlInfoMessageEventHandler(_con_InfoMessage);
事件处理程序如下所示:

static void _con_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    string myMsg = e.Message;            
}
e.Message是打印到SQLServerMgmtStudio中的消息窗口的消息

虽然它并不漂亮,可能需要一些难看的解析代码,但我希望,至少您可以通过这种方式获得这些消息


Marc

您无法从SQL Server中捕获、捕获或使用这些消息。但是,您可以从客户端应用程序中接收它们。

可能是真的,但如果可能的话,这种技术还有其他应用程序,就像在优化查询时解析消息窗格上显示的SET STATISTICS IO的结果一样。这是一个有趣的问题,但我认为解析是由客户端应用程序而不是sql server完成的。是否有可能获得CLR进程,修复问题并向服务器发布第二个版本,这样就不会影响此进程的现有使用者?如果最终证明不可能,我将不得不这样做。不过,我想我可以先看看是否可以使用现有的进程。这与现有进程的工作方式类似。我们有一个外部脚本,它在每台服务器上运行这个过程,并捕获文本文件中的消息输出,然后遍历并利用该文本文件。但是如果我不得不使用shell脚本,我可能会直接收集信息,而不是调用proc现有的proc报告一些T-SQL无法直接调用的驱动器空间统计信息