【问题标题】:Use DBCC with select将 DBCC 与选择一起使用
【发布时间】:2021-09-25 19:11:40
【问题描述】:

我正在尝试从 DBCC 输出中获取 MessageText 字段,但这会返回语法错误

SELECT MessageText FROM (DBCC CHECKDB (test) WITH TABLERESULTS)

我应该使用什么?

在 SMSS 中只能检测并返回 MessageText 字段,微软是怎么做到的?

【问题讨论】:

  • 副本似乎无法解决您的问题。我是否认为您希望以编程方式而不是创建临时表来获得此结果?
  • @Steve 事实上,我相信 SMSS 并没有创建一个表来做到这一点,它在没有“WITH TABLERESULTS”的情况下也能工作

标签: c# sql-server


【解决方案1】:

要直接在您的程序中返回 DBCC 命令的结果,您需要订阅 SqlConnection 类的 InfoMessage 事件。

void Main()
{
    string db = "Linqpadtest";
    List<string> messages = new List<string>();
    using(SqlConnection cnn = new SqlConnection("Data Source=;Initial Catalog=master;Integrated Security=True;"))
    {
        cnn.Open();
        cnn.InfoMessage += (s, e) =>
        {
            messages.Add(e.Message);
        };
        SqlCommand cmd = new SqlCommand($"DBCC CHECKDB ('{db}')", cnn);
        _ = cmd.ExecuteScalar();
        string result = string.Join(Environment.NewLine, messages);
        Console.WriteLine(result);
    }
}

【讨论】:

    【解决方案2】:

    当您指定WITH TABLERESULTS 时,结果会以表格形式返回。但是,很难通过 SQL 访问它,因为它类似于从存储过程中获取结果。

    也许您可以使用INSERT...EXEC...,但在 C# 中,您可以只使用标准 ADO 读取机制来获取特定列。

    最简单的方法是使用DataReader

    using(var cnn = new SqlConnection(YourConnString))
    using(var cmd = new SqlCommand("DBCC CHECKDB (test) WITH TABLERESULTS", cnn) {CommandTimeout = 3600});
    {
        cnn.Open();
        using(var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
                Console.WriteLine(reader["MessageText"]);
        }
    }
    

    我添加了CommandTimeout = 3600,因为CHECKDB 可能需要很长时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 2021-06-04
      • 2021-01-22
      • 2014-03-02
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多