开发者社区> 问答> 正文

SQLSERVER 语法错误

数据库SQLSERVER 2008,druid1.1.3. 在proxyFilters中配置了wall-filter之后,如下语句执行提示语法错误 WITH A AS ( SELECT GETDATE() AS TTT ) SELECT TTT FROM A UNION ALL SELECT TTT FROM A

报错信息: Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'WITH' 附近有语法错误。 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216) ~[sqljdbc4-4.0.jar:na] at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515) ~[sqljdbc4-4.0.jar:na] at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404) ~[sqljdbc4-4.0.jar:na] at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350) ~[sqljdbc4-4.0.jar:na] at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696) ~[sqljdbc4-4.0.jar:na] at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715) ~[sqljdbc4-4.0.jar:na] at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180) ~[sqljdbc4-4.0.jar:na] at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155) ~[sqljdbc4-4.0.jar:na] at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:332) ~[sqljdbc4-4.0.jar:na] at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3051) ~[druid-1.1.3.jar:1.1.3] at com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:619) ~[druid-1.1.3.jar:1.1.3] at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3049) ~[druid-1.1.3.jar:1.1.3] at com.alibaba.druid.filter.FilterAdapter.preparedStatement_execute(FilterAdapter.java:1080) ~[druid-1.1.3.jar:1.1.3] at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3049) ~[druid-1.1.3.jar:1.1.3] at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:440) ~[druid-1.1.3.jar:1.1.3] at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3049) ~[druid-1.1.3.jar:1.1.3] at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:168) ~[druid-1.1.3.jar:1.1.3]

不配置proxyFilters就没问题, 下面这个样子也可以规避 WITH A AS ( SELECT GETDATE() AS TTT ) SELECT * FROM ( SELECT TTT FROM A UNION ALL SELECT TTT FROM A ) T

原提问者GitHub用户SaddestMoon

展开
收起
山海行 2023-07-05 20:41:10 87 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    如果在使用SQLServer 2008和Druid 1.1.3时,在proxyFilters中配置了wall-filter,并且执行类似下面的带有WITH子句的查询语句时,可能会出现语法错误的问题:

    sql_more
    Copy
    WITH A AS ( SELECT GETDATE() AS TTT ) SELECT TTT FROM A UNION ALL SELECT TTT FROM A
    这是因为wall-filter默认会对SQL语句进行一些语法检查和限制,以避免SQL注入等安全问题。而在SQLServer 2008中,WITH子句通常需要使用括号包围,例如:

    sql_more
    Copy
    WITH A AS ( SELECT GETDATE() AS TTT ) SELECT TTT FROM A UNION ALL SELECT TTT FROM A
    但是,由于wall-filter默认对括号的使用有一些限制,因此可能会出现语法错误的问题。针对这种情况,可以通过在wall-filter配置中增加allowWithAs属性来解决,例如:

    Copy
    filters=wall,config
    wall.config.allowWithAs=true
    这样就可以允许使用WITH子句并包含括号,避免出现语法错误的问题。需要注意的是,开启allowWithAs属性可能会增加SQL注入等安全风险,因此需要根据实际情况进行相应的权衡和调整。

    2023-07-30 13:36:52
    赞同 展开评论 打赏
  • 在SQL Server中,WITH子句是用于定义临时表的,而在这个语句中,WITH子句是用来定义一个临时表A的,但是在后面的SELECT语句中,使用了临时表A来进行查询,这是不符合语法规则的。因此,需要将WITH子句中的表名A改为其他名称,或者将该语句拆分成两个独立的语句来执行。

    2023-07-11 10:13:34
    赞同 展开评论 打赏
  • 验证过了没问题哈,看堆栈也不像是druid的问题

    原回答者GitHub用户wenshao

    2023-07-06 11:53:27
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载