【问题标题】:How to parse a SQL Query statement for the names of the tables如何解析表名称的 SQL 查询语句
【发布时间】:2010-06-26 01:17:06
【问题描述】:

我有一个表示 SQL 查询的字符串,我需要从该字符串中提取表的名称。例如:

SELECT * FROM Customers

将返回“客户”。或者

SELECT * FROM Customers c, Addresses a WHERE c.CustomerName='foo'

SELECT a.AddressZip FROM Customers c
INNER JOIN Addresses a ON c.AddressId=a.AddressId

将返回“客户、地址”。更高级:

(SELECT B FROM (SELECT C FROM (SELECT Element AS C FROM MyTable)))

只会返回“MyTable”

(注意,我可能打错了查询,但你明白了)。

最好/最准确的方法是什么?

【问题讨论】:

  • 问题“为什么?”浮现在脑海中......
  • 您是否针对任何特定的 RDBMS/方言?关于解析 SQL 有一些关于 SO 的问题,例如stackoverflow.com/questions/589096/parsing-sql-code-in-c 虽然我没有看到任何特别的结论。
  • 至于“为什么”是因为我正在解析查询日志文件并显示访问次数最多的表、操作等。这并不重要:) 至于我的目标是什么,它是 MS-SQL。
  • @esac:这很重要。因为有时人们会发布关于问题解决方案细节的问题,而不是实际问题本身。
  • @jpaugh 大约 25 年前,当我还是个小男孩时,我选择了这个网名。当时市场上刚刚出现了一个名为“Red Hat”的新 Linux 发行版。我几乎只使用了 5 年的 Linux,然后我找到了一份工作,进入了 Windows 计算机的商业世界。

标签: c# string


【解决方案1】:

这是一种方法,使用商业实用程序(sqlparser.com 149 美元,免费试用)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using gudusoft.gsqlparser;

namespace GeneralSqlParserTest
{
    class Program
    {
        static void Main(string[] args)
        {
            TGSqlParser sqlparser = new TGSqlParser(TDbVendor.DbVMssql);

            sqlparser.SqlText.Text = "SELECT * FROM Customers c, Addresses a WHERE c.CustomerName='foo'";
            sqlparser.OnTableToken += new TOnTableTokenEvent(OnTableToken);

            int result = sqlparser.Parse();
            Console.ReadLine();
        }

        static void OnTableToken(object o, gudusoft.gsqlparser.TSourceToken st, gudusoft.gsqlparser.TCustomSqlStatement stmt)
        {
            Console.WriteLine("Table: {0}", st.AsText);
        }
    }
}

请注意,它会将“c”和“a”计为表格,但从结果中过滤掉单个字符名称会非常简单

我没有使用或拥有这个工具,只是我在搜索后发现的......

【讨论】:

  • 这是一个好的开始,尽管它选择 'c' 和 'a' 的事实很烦人,因为有些别名使用更长的名称。
【解决方案2】:

Brian 提到的通用 SQL Parser 可以更准确地实现这一点,这里有一篇文章:

Get table and column in a complicated SQL script

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2012-11-02
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多