我正在尝试在Vb.net中创建一个应用程序;因此,用户将提供具有多个表作为输入的查询。如果没有返回任何记录,我的程序必须分析该查询并查明在查询中给出的条件中缺少记录的表。
例如:
SELECT table1.column1, table2.column2
FROM table1
, table2
WHERE table1.column1 = table2.column3
and table2.column2 = Y;
在表2中,记录可能存在,而table1缺失。这意味着我的程序必须通知用户表1中的记录不存在。
用户将动态提供查询,我的程序必须对其进行分析。 是否可以使用此功能创建应用程序?
首先我需要分离查询,因为我需要获取给定查询中存在的表名,并将where子句与每个表相关联
答案 0 :(得分:0)
这是可能的。但要做到这一点,使其变得强大,可能需要做很多工作。
对用户如何编码sql查询有什么限制吗?如果没有,您将不得不准备分析任意复杂性的查询,包括(取决于您的用户)CTE,子查询等。
但是如果你真的想尝试这个,首先要看一下FROM子句here的语法图。这将显示FROM子句可以采用的所有表单。
您的程序必须能够确定语法图的哪个“分支”有效,并且基于此,确定子句中的哪个单词表示表名。它必须这样做,以便它可以告诉WHERE子句中的哪些单词引用该表中的字段。
要做到这一点,首先需要一个tokenizer(能够从SQL语句中提取单词和符号),然后,很可能需要一个基于有限状态机的解析器。
就像我说的,这将是一项很多工作。