使用SQL"消息"窗格的结果

Bra*_*adC 2 sql-server ssms sql-server-2005

我有一个现有的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
Run Code Online (Sandbox Code Playgroud)

因此,那里没有实际的SELECT语句,如果你运行它,你只会在Messages窗格中看到这些结果.

我有什么方法可以这些结果用作更大查询的一部分吗?把它们放在临时表或其他东西,所以我可以解析它们?

没有"正常的东西"有效,因为这里没有真正的"输出":

INSERT INTO #output
EXEC OutputTest 100, 'bob'
Run Code Online (Sandbox Code Playgroud)

只是表明

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

(0 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

在消息窗格上,临时表实际上没有任何内容.

mar*_*c_s 6

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

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

_con.InfoMessage += new SqlInfoMessageEventHandler(_con_InfoMessage);
Run Code Online (Sandbox Code Playgroud)

事件处理程序将如下所示:

static void _con_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    string myMsg = e.Message;            
}
Run Code Online (Sandbox Code Playgroud)

"e.Message"是打印到SQL Server Mgmt Studio中的消息窗口的消息.

虽然它不漂亮,可能需要一些丑陋的解析代码,但至少你可以抓住这些消息,我希望!