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 中的预处理语句不返回任何结果的主要内容,如果未能解决你的问题,请参考以下文章

JAVA SQL注入测试

CREATE VIEW 必须是批处理 MS SQL Server 中的唯一语句

我对 Java 中的准备好的语句有问题 - Mysql 8.0 [重复]

王者荣耀新英雄“女娲”惨遭削弱,曾经的霸主将一去不返!

报错处理:Cause: java.sql.SQLException: The server time zone value

java sql数据库查询语句怎么写