我有一个现有的SQL 2005存储过程,出于某种原因,它将结果输出到SSMS中的 Messages 窗格而不是 Results 窗格。 (它实际上已经编译并部署到我们所有服务器的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)
消息窗格上的,临时表实际上没有任何内容。
答案 0 :(得分: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中消息窗口的消息。
虽然它不漂亮并且可能需要一些丑陋的解析代码,但至少你可以通过这种方式掌握这些消息,我希望!
马克
答案 1 :(得分:1)
我认为没有办法,但即使有,我认为你应该认真考虑是否是一个好主意。这听起来像一个软糖,只会让你长期痛苦。创建一个完全符合您想要的替代过程,听起来像是一个更好的计划。
答案 2 :(得分:1)
无法从结果中的消息窗格中获取消息。 如果您考虑一下,SSMS只是一个以您看到的方式解析这些消息的客户端。
如果您想在自己的应用中使用它们,请查看Connection Events in ADO.NET
答案 3 :(得分:1)
我认为可能的唯一方法是通过RAISERROR命令打印输出。在这种情况下,您可以使用TRY / CATCH在其他地方捕获它。
但这只是一个想法:我从来没有这样做过。实际上,我们唯一远程关闭的是我们有一个命令行工具来在批处理作业中运行存储过程,而不是使用sql server agent来安排它们。这样,我们所有的夜间作业都安排在一个地方(Windows任务调度程序)而不是两个,命令行工具将打印到消息窗口的任何内容捕获到我们监视的公共日志系统中。因此,一些程序会向该窗口输出相当多的细节。
答案 4 :(得分:1)
您无法在SQL Server中捕获,捕获或使用这些消息。但是,您可以在客户端应用程序中接收它们。