java - PreparedStatement 在 IN 子句中包含数千个参数

标签 java sql sql-server sql-server-2005 jdbc

我确实阅读了这个问题 PreparedStatement IN clause alternatives? 的解决方案.但就我而言,我在 In 子句中有大约 5000 个参数,这将导致 java.sql.SQLException: Prepared or callable statement has more than 2000 parameter markers。

我正在使用类似的 SQL

String sql = "select * from project in " + projectIds.toString() 

projectIds 是一个类似于“(1,2,3,4....)”的 StringBuilder,但代码安全报告称它可能会导致 sql 注入(inject)。所以我必须使用?占位符来避免它。

我试过

String sql = "select * from project where charindex(','+convert(varchar(max),id)+',', ?)>0";
statement.setString(1,projectIds.toString);//projectIds like ",1,2,3,4,"..

但它以不正确的语法错误结束。

有什么解决办法吗???

最佳答案

Hogan 关于改用表格的建议是一个很好的建议。我唯一要更改的是查询,因为 JOIN 会为 tablelist 中的每个值生成一行。相反(猜测你的列名)

select * from project 
where projectID in (select id from tablelist)

where exists (select 1 from tablelist where id = projectID)

关于java - PreparedStatement 在 IN 子句中包含数千个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15400243/

相关文章:

java - Java中的字节数组和Int转换

java - ClientHandlerException : MIME media type, 多部分/表单数据,未找到

java - java中的阿拉伯数字

sql - 表变量批量插入的 SQL 语句有什么问题

sql-server - 在大尺寸表上创建外键

sql-server - 通过 sql 语句 "delete from tableName"删除多行,而 TRIGGER "After Delete"已应用于该语句

java - Android:IF 语句在通过首选项设置时不起作用

mysql - 参数化 MySQL 工作台语句 : How to define variables

sql - Azure SQL : can’t ping the Private Endpoint from on-prem

sql - 使用增量记录创建基于 SQL 查询的每日报告