如何验证SQL查询语法?

5

Java 1.4

SQL Server 2000

我正在从管理员用户那里获取 SQL 查询输入(用于验证字段值与通过执行 SQL 查询检索的值是否相符),该查询将存储在数据库中,稍后我将根据字段执行 SQL 查询。在将 SQL 查询插入数据库之前,我想在 Java 代码中验证其语法。

Fields         Sql Query

stateCode      select statecode from states
district code  select district code from districts

类似问题:https://dev59.com/Q3RB5IYBdhLWcg3wUVxd - Michael Lloyd Lee mlk
6个回答

9
创建一个具有查询字符串的 PreparedStatement;如果这个步骤成功,那么查询字符串就是正确的(但还没有执行任何操作)。

不幸的是,这需要连接,这在单元测试中无法工作。 - 18446744073709551615
1
@18446744073709551615 这个问题不是关于单元测试的。话虽如此,为什么在进行单元测试时不能有数据库连接呢? - Erich Kitzmueller

6

我认为没有任何(简单的)方法来验证SQL。

SQL语法很复杂,允许以多种不同的方式输入语句。

我认为你最好的办法就是执行SQL语句,如果出现SQL异常,则查看是否是语法错误导致的。

你可以在SQL之前添加一些内容,以避免实际执行查询。

在Sybase中,可以使用以下命令:

SET NOEXEC ON


3

为什么要让他们输入整个SQL语句?

只需提供字段,让他们输入州码或地区码。

然后检查输入的值是否为数字,并使用输入的值运行适当的查询。


它不是特定的。表名和列名可以是任何东西,具体取决于字段类型以及一些条件或连接操作。 - Maddy.Shik

2

可能的解决方案是获取查询的执行计划,如果它能够解释查询,我猜它就是有效的。缺点是它不喜欢参数化查询。


如何获取查询的执行计划? - Maddy.Shik
这是一个非常好的问题。对于在SQL Server上如何做到这一点,我一点头绪也没有,抱歉。 - Gareth Davis

2

您可以执行 SET FMTONLY ON 命令,然后执行查询语句以查看其是否有效。只需记得在 finally 块中执行 SET FMTONLY OFF 命令,因为它是一个连接级别的设置。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接