【发布时间】:2010-06-17 05:36:19
【问题描述】:
根据MSDN,SqlDataReader.GetSchemaTable 返回执行查询的列元数据。我想知道是否有类似的方法可以为给定查询提供表元数据?我的意思是涉及哪些表以及它有哪些别名。
在我的应用程序中,我得到了查询,我需要以编程方式附加 where 子句。使用GetSchemaTable(),我可以获得列元数据及其所属的表。但是即使表有别名,它仍然返回真实的表名。有没有办法获取该表的别名?
以下代码显示获取列元数据。
const string connectionString = "your_connection_string";
string sql = "select c.id as s,c.firstname from contact as c";
using(SqlConnection connection = new SqlConnection(connectionString))
using(SqlCommand command = new SqlCommand(sql, connection))
{
connection.Open();
SqlDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo);
DataTable schema = reader.GetSchemaTable();
foreach (DataRow row in schema.Rows)
{
foreach (DataColumn column in schema.Columns)
{
Console.WriteLine(column.ColumnName + " = " + row[column]);
}
Console.WriteLine("----------------------------------------");
}
Console.Read();
}
这将正确地为我提供列的详细信息。但是当我看到BaseTableName 列Id 时,它给出的是contact,而不是别名c。有没有办法从上述查询中获取表架构和别名?
任何帮助都会很棒!
编辑
虽然我可以使用 Rob 建议的执行计划,但我希望有任何替代的简单方法。
tomekszpakowicz 回答问题
您是(或您的应用程序)来源吗 有问题的查询?在这种情况下 你应该知道别名。
我不是查询的作者。我们有一个系统,用户可以在其中输入查询。我们使用我上面解释的方法从中构建列。这些细节将被保留,另一个用户可以使用它,比如添加新的标准等。所以我们需要根据我们拥有的信息动态地构建 SQL。所以当一个列被别名并且我们没有得到别名时,那么构造的 where 子句将是无效的。
谢谢
【问题讨论】:
-
你为什么要这样做?为什么要将 where 子句附加到此查询?
-
另一种简单的方法?使用 BaseTableName,而不是别名。真实的表名很好用,为什么你认为你需要别名?