Java/SQL Server 中的预处理语句不返回任何结果
Posted
技术标签:
【中文标题】Java/SQL Server 中的预处理语句不返回任何结果【英文标题】:Prepared Statement in Java/SQL Server not returning any results 【发布时间】:2021-12-11 08:21:22 【问题描述】:List<Guest> guestList = new ArrayList<>();
String query = "select * from Guests where ? like ?";
System.out.println("select * from Guests where " + property + " like '%" + value + "%'");
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, property);
preparedStatement.setString(2, "'%" + value + "%'");
ResultSet resultSet = preparedStatement.executeQuery();
guestList = getGuestListFromResultSet(resultSet);
return guestList;
正如您在上面看到的,我创建了一个 Prepared Statement,稍后填充了 2 个值:属性和值。运行上述查询应该会在 SQL Server 中给我一些结果。 我还尝试了这些变体来设置第二个参数(值):
preparedStatement.setString(2, "%" + value + "%");
preparedStatement.setString(2, value);
这些似乎都不起作用。起作用的只是从字符串连接构建查询:
PreparedStatement preparedStatement = connection.prepareStatement("select * from Guests where " + property + " like '" + value + "'");
但是,我想使用准备好的语句。
【问题讨论】:
您不能将对象名称(视图、表、列等)作为preparedStatement 参数值传递。 【参考方案1】:您不能将变量用作列名。相反,您可以使用动态 SQL
String query = """
DECLARE @sql nvarchar(max) = '
select *
from Guests
where ' + QUOTENAME(?) + ' like @value;
';
EXEC sp_executesql @sql,
N'@value nvarchar(100)',
@value = ?;
""";
注意使用QUOTENAME
来正确转义列名。
还要注意使用sp_executesql
来传递值。
我不确定 JDBC 驱动程序,但理想情况下,您应该使用正确的命名参数,而不是
?
【讨论】:
以上是关于Java/SQL Server 中的预处理语句不返回任何结果的主要内容,如果未能解决你的问题,请参考以下文章
CREATE VIEW 必须是批处理 MS SQL Server 中的唯一语句
我对 Java 中的准备好的语句有问题 - Mysql 8.0 [重复]
报错处理:Cause: java.sql.SQLException: The server time zone value