gpt4 book ai didi

c# - 如何从包含 SELECT 语句的字符串中获取表名

转载 作者:太空狗 更新时间:2023-10-30 00:15:50 25 4
gpt4 key购买 nike

我有一个包含sql命令的字符串,

像这样:

strCommand = "Select [Feild1], [Feild2] From TableName Order By [Feild1] desc" ;

如何在这个字符串中找到表名?

最佳答案

到目前为止的解决方案都采用了在字符串内搜索的方法。您没有提到您的 SQL 查询是否总是看起来相似,但是有许多查询变体可以包含在这些解决方案中。考虑...

  • 从 TableName 中选择 Field1、Field2
  • SELECT Field1,Field2 FROM [TableName]
  • 从 dbo.TableName 中选择 Field1、Field2
  • 从 Table1Name、Table2Name 中选择 Field1、Field2

如果您尝试解析的查询是您拥有数据库的查询,您可以让 SQL Server 为您完成解析查询的艰苦工作,而不是试图解释 SQL 中的所有情况。您可以使用 SET SHOWPLAN_ALL ON 执行查询,这将生成一个查询计划表。然后,您可以分析 Arguments 列,该列以标准格式包含查询将涉及的所有字段。示例程序如下:

SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
conn.Open();

SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SET SHOWPLAN_ALL ON";
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT [Field1], [Field2] FROM [TableName]";

DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());

Regex objectRegex = new Regex(@"^OBJECT:\(\[(?<database>[^\]]+)\]\.\[(?<schema>[^\]]+)\]\.\[(?<table>[^\]]+)\]\.\[(?<field>[^\]]+)\]\)$", RegexOptions.ExplicitCapture);

List<string> lstTables = new List<string>();
foreach (DataRow row in dt.Rows)
{
string argument = row["Argument"].ToString();
if (!String.IsNullOrEmpty(argument))
{
Match m = objectRegex.Match(argument);
if (m.Success)
{
string table = m.Groups["schema"] + "." + m.Groups["table"];
if (!lstTables.Contains(table))
{
lstTables.Add(table);
}
}
}
}

Console.WriteLine("Query uses the following tables: " + String.Join(", ", lstTables));

这将处理所有形式的查询名称并返回查询中涉及的所有表,无论它们是如何包含的。

关于c# - 如何从包含 SELECT 语句的字符串中获取表名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10959204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com