最近在用Nutz开发项目,在一次执行自定义分页的SQL时出现错误,截取部分报错信息如下:
### com.microsoft.sqlserver.jdbc.SQLServerException: '@P0' 附近有语法错误。
...
...
...
org.nutz.dao.DaoException: !Nutz SQL Error: 'SELECT TOP 10 * FROM Inventory'
PreparedStatement:
'SELECT TOP ? * FROM Inventory'
CaseMessage='@P0' 附近有语法错误。
...
执行的SQL如下:
Sql sql = Sqls.create("SELECT TOP @record * FROM Inventory");
sql.params().set("record", 10);
this.dao.execute(sql);
后来查询资料得知SQL Server中查询使用Select Top ? * From TableName Where ColumnName = ?
的SQL语句时,其中的问号?
是PreparedStatement
预编译对象的参数占位符,需要使用setXX()
系列方法对其赋值后再执行。
但是,Top
后面是不允许使用问号?
占位符的,@P0
附近有语法错误就是由此引起的。
解决方案:
使用拼接字符串方式拼接SQL语句:
"Select Top " + record + " * From Inventory"
原文地址:https://www.lwhweb.com/2017/10/03/sql-server-near-p0-error/