【问题标题】:Get column names using aliases使用别名获取列名
【发布时间】:2015-01-05 11:14:30
【问题描述】:

我使用的是 SQL Server 2008,并且我有一个如下所示的 SP:

SELECT id = t.nTableId
       ,t.nTableId AS id2
       ,t.nTableId
FROM   dbo.table AS t

我正在使用需要列名的 .NET 应用程序: id、id2 和 nTableId。

现在我正在使用 sp_helptext 将 SP 作为字符串列表获取

var columns = new List<string>();
using (var reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
        columns.Add(reader.GetString(0));
    }
}

在这个字符串列表中,我试图找到 SELECT 和 FROM,然后获取这两者之间的行。我会格式化这些行,以便之后看起来正确。

那么问题是我觉得这个解决方案不够好。你们有什么技巧可以让 SQL Server 2008 在这种情况下检索列名 id、id2 和 nTableId。

【问题讨论】:

  • sp_describe_first_result_set 可能是您正在寻找的,并且不涉及一大堆字符串操作。
  • 为什么需要列名?听起来像是 XY 问题。
  • @RichardHansell 我付出了这么多的努力,结果就是这样。我去看看!
  • @SriramSakthivel 因为我在应用程序中使用它来创建基于列名的 XML 文件

标签: c# sql sql-server-2008


【解决方案1】:
var columns = new List<string>();
DbCommand cmd = cnn.CreateCommand("SELECT * FROM Table1",  CommandType.Text);
DataTable Dt= cnn.GetDataTable(cmd);
foreach (System.Data.DataColumn col in dt.Columns)
{
    columns.Add(col.ColumnName);
}

【讨论】:

    【解决方案2】:

    这将是一个两步的过程。 首先使用您的存储过程触发一个查询,以便不返回任何数据。 喜欢:

    SELECT * FROM OPENQUERY(LOCALSERVER, 'EXEC your_stored_procedure') WHERE 1=2

    由于条件永远不会成立,因此不会返回任何数据。我们需要使用OPENQUERY(主要用于链接服务器),因为我们要动态修改存储过程查询。

    现在您可以使用阅读器提取空结果集的表架构

    using(var reader = command.ExecuteReader())
    {
          // This will return false - we don't care, we just want to make sure the schema table is there.
             reader.Read();
             var table = reader.GetSchemaTable();
             foreach (DataColumn column in table.Columns)
             {
                 Console.WriteLine(column.ColumnName);
             }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2011-06-27
      • 2014-07-18
      • 2012-06-16
      相关资源
      最近更新 更多