Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Java源代码中检索所有SQL查询?_Java_Sql_Parsing_Migration_Text Parsing - Fatal编程技术网

如何从Java源代码中检索所有SQL查询?

如何从Java源代码中检索所有SQL查询?,java,sql,parsing,migration,text-parsing,Java,Sql,Parsing,Migration,Text Parsing,我们有许多使用Sybase数据库的JavaSpring项目 我们想把它迁移到MSSQL 任务之一是开发一个脚本来查找项目源代码中使用的所有SQL查询。此外,在项目中还引入了存储过程的使用 这样做的适当方法是什么 @Override public void update(int id, Entity entity) { jdbcTemplate.update( "UPDATE exclusion SET [enabled] = :enabled WHERE [id] = :

我们有许多使用Sybase数据库的JavaSpring项目

我们想把它迁移到MSSQL

任务之一是开发一个脚本来查找项目源代码中使用的所有SQL查询。此外,在项目中还引入了存储过程的使用

这样做的适当方法是什么

@Override
public void update(int id, Entity entity) {
    jdbcTemplate.update(
        "UPDATE exclusion SET [enabled] = :enabled WHERE [id] = :id",
        HashMapBuilder.<String, Object>builder()
                .put("id", id)
                .put("enabled", entity.enabled)
                .build()
    );
}
@覆盖
公共无效更新(整数id,实体){
jdbcTemplate.update(
“更新排除集[enabled]=:enabled,其中[id]=:id”,
HashMapBuilder.builder()
.put(“id”,id)
.put(“已启用”,实体.enabled)
.build()
);
}
这是最简单的情况


首先,我们需要对源代码进行正则化,以便通过SQL关键字列表来查找SQL。

本质上,您需要查找提供给jdbc调用的任何(SQL)字符串

这意味着您的工具必须知道jdbc方法是什么(例如,“jdbcTemplate.update”),以及每个方法的哪个参数是要作为SQL的字符串。这有点容易,因为它是有文档记录的

很难找到字符串,因为要动态地组装它;不能保证整个SQL字符串实际上作为函数调用的直接参数存在。它可以通过使用“+”和任意函数调用组合SQL字符串片段来计算

这意味着您必须从编译器的角度解析Java,了解每个符号的含义,并通过代码中的数据流跟踪值

在地球上,正则表达式无法可靠地做到这一点。(您可以做得很差,也许这对您来说已经足够好了,我建议您查找所有jdbc方法调用名)

还有一个更糟糕的问题:一旦您弄清楚了SQL字符串是什么,您就需要知道它是否符合MSSQL。这需要使用MSSQL兼容的解析器解析抽象字符串(记住,它是由一堆片段组装而成的)(同样,没有正则表达式可以进行上下文无关的解析),并抱怨没有解析的字符串

如果MSSQL的语句看起来与sybase语句相同,但含义不同,那么这可能还不够

这是一个很难用自动化很好地解决的问题。(有研究论文描述了上述所有活动)

我认为您需要做的是查找所有SQL调用,并手动检查每个调用的兼容性


下次,您应该使用数据库访问层构建应用程序。然后所有SQL调用都集中在一个地方。

这个问题涉及面很广,找到最佳解决方案取决于问题中没有解释的许多事情。首先,脚本是否应该在示例中找到sql代码?有没有任何理由说明这个查询在MSSQL中无法正常工作?@JoakimDanielson我很乐意把事情弄清楚。是的,脚本应该查找上面的SQL代码,但这是最简单的情况。在这种情况下,可以通过简单的正则表达式来实现。不,没有理由不使用MSSQL进行此查询,但这也是最简单的情况。我们希望找到Sybase特定的SQL来找到替换它的方法。