我确实阅读了这个问题 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/