2009-07-28 30 views
2

的结果我有一个现有的SQL 2005的存储过程,由于某种原因,输出在SSMS代替结果窗格中的消息窗格中的结果。 (它实际上是一个已经编译并部署到我们所有服务器的CLR程序,并且用于另一个日常程序,所以我不能改变它,我只是想使用它的输出)。一个存储过程,其行为以同样的方式:使用SQL“消息”窗格

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 

所以没有实际选择声明在那里,如果你运行它,你会看到只有在信息窗格中的所有结果。

有没有什么办法让我使用这些结果作为更大查询的一部分?把他们放在一个临时表或其他东西,所以我可以解析出来?

无的“正常的东西”的作品,因为没有真正的“输出”在这里:

INSERT INTO #output 
EXEC OutputTest 100, 'bob' 

只是表明

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

(0 row(s) affected) 
上的消息窗格

,并临时表没有按”实际上可以得到任何东西。

回答

1

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

1

我不认为有一种方法,但即使有我认为你应该认真考虑它是否是一个好主意。这听起来像是一个软糖,它只会导致你长期的痛苦。创建一个完全符合你的想法的替代过程听起来像是一个更好的计划。

+0

也许是正确的,但是如果它*可能,这个技术还有其他应用,比如在调整查询时解析出现在消息窗格上的“SET STATISTICS IO ON”的结果。 – BradC 2009-07-28 16:57:25

+0

这是一个有趣的观点,但我认为解析是由客户端应用程序完成的,而不是由sql服务器完成的。是否有可能无法掌握CLR过程,解决问题并向服务器发布第二个版本,以便不影响该过程的现有消费者? – 2009-07-28 17:14:21

1

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

,如果你婉使用它们在你的应用程序来看看Connection Events in ADO.NET

1

我能想到的是,如果输出通过RAISERROR命令打印,这可能是可能是唯一的出路。在这种情况下,您可以使用TRY/CATCH将其捕获到其他地方。

但这只是一个想法:我从来没有这样做过。实际上,我们做的远程关闭的唯一事情是我们有一个命令行工具来运行批处理作业中的存储过程,而不是使用sql server代理来安排它们。这样,我们所有的夜间工作都安排在一个地方(Windows任务计划程序)而不是两个,命令行工具将打印到消息窗口的任何内容捕获到我们监视的通用日志记录系统中。所以一些程序会输出相当多的细节到那个窗口。

6

你能从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”是打印出来的消息SQL Server Mgmt Studio中的消息窗口。

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

马克