【问题标题】:Using the result of the SQL "Messages" pane使用 SQL“消息”窗格的结果
【发布时间】:2009-07-28 16:46:03
【问题描述】:

我有一个现有的 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)

在消息窗格中,临时表实际上并没有放入任何内容。

【问题讨论】:

    标签: sql-server sql-server-2005 ssms


    【解决方案1】:

    您可以从 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 消息窗口中的消息。

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

    马克

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 也许是真的,但如果它可能的,这种技术还有其他应用,例如解析出现在消息窗格上的“SET STATISTICS IO ON”的结果,当您正在调整查询。
        • 这是一个有趣的点,但我想解析是由客户端应用程序而不是 sql 服务器完成的。是否无法获取 CLR proc、修复问题并向服务器发布第二个版本,这样您就不会影响该 proc 的现有使用者?
        • 如果这最终证明是不可能的,我将不得不这样做。不过,我想我可能会先看到是否可以使用现有的 proc。
        【解决方案4】:

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

        如果您想在您的应用中使用它们,请查看Connection Events in ADO.NET

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • 这类似于现有流程的工作方式。我们有一个外部脚本在每个服务器上运行这个过程,并在一个文本文件中捕获消息输出,然后通过并利用该文本文件。但是如果我无论如何都要使用 shell 脚本,我可能只是直接收集信息而不是调用 proc(现有的 proc 报告一些 T-SQL 无法直接调用的驱动器空间统计信息)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-14
          • 1970-01-01
          • 1970-01-01
          • 2011-04-06
          • 2010-10-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多