替换SQL查询中的表名,列名周围的转义字符

时间:2017-06-09 10:38:16

标签: java sql sql-server

例如

query = " select "2017-06-08" as new_colum, "true" as my_flag, "column1", "column2" from "table1" "

上述查询应更改为:

select "2017-06-08" as new_column, "true" as my_flag, [column1], [column2] from [table1]。 (MS SQL格式)

我可以使用像jsql解析器这样的解析器吗?或者还有其他更好的方法吗?

2 个答案:

答案 0 :(得分:7)

如果不是因为您的日期被双引号括起来,我们可以使用"(.*?)"[$1]替换String#replaceAll()。但双引号日期的存在使问题更加困难。我更新的答案使用以下模式仅以双引号定位非日期:

(\s+)"([^\d].*?)"

这只会匹配一个前面至少有一个空白字符的引用字词,并且引号内的第一个字符不是一个数字。这应排除所有日期,并且不应排除任何列,因为SQL Server列名称不能以数字开头。

我在此假设每个引用的列前面都有空格。这应该没问题,假设查询字符串中的第一个单词始终是SELECTUPDATE之类的关键字。

String query = "select \"2017-06-08\" as new_colum, \"column1\", \"column2\" from \"table1\"";
query = query.replaceAll("(\\s+)\"([^\\d].*?)\"", "$1[$2]");
System.out.println(query);

<强>输出:

select "2017-06-08" as new_colum, [column1], [column2] from [table1]

顺便说一句,如果您想知道在引用术语开始之前检查空格的重要性,请尝试从正则表达式中取出该要求。您会看到replaceAll()会错误地将结束引用作为术语的开头,而不是。{/ p>

Demo

答案 1 :(得分:0)

SQL Server Feature Pack附带了一个用于解析T-SQL源代码的专用API:[ TransactSql ScriptDom在Microsoft.SqlServer.TransactSql.ScriptDom命名空间中可用。

在不同的类中,有一个TSqlParser类,每个SQL Server版本都有子类。例如,对于SQL Server 2008,有以下类TSql100Parser

关于这个问题,here我找到了一个关于解析SELECT语句的C#示例。