6

この Question PreparedStatement IN 句の代替案から解決策を読みましたか? . しかし、私の場合、 In 句に約 5000 個のパラメーターがあり、 java.sql.SQLException: Prepared or callable statement has more than 2000 parameter marker につながります。

私は次のようなSQLを使用していました

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

projectIds"(1,2,3,4....)" のような StringBuilder ですが、コード セキュリティ レポートによると、SQL インジェクションにつながる可能性があります。だから私は使用する必要がありますか?それを避けるためのプレースホルダー。

使ってみた

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

しかし、正しくない構文エラーが発生します。

解決策はありますか???

4

3 に答える 3

2

代わりにテーブルを使用するというホーガンの提案は良いものです。JOINテーブルリストのすべての値に対して行を生成するため、変更するのはクエリだけです。代わりに(列名を推測して)

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

また

where exists (select 1 from tablelist where id = projectID)
于 2013-03-14T02:57:22.023 に答える
1

これを行う最善の方法は、in ステートメントを使用しないことです。代わりに、チェックしたいすべての値をテーブルに入れて、結合を使用する必要があります。

たとえば、リストを持つ 1 つの列 (id と呼ばれる) を持つテーブルがある場合、ステートメントは次のようになります。

 select *
 from project
 join tablelist on project.project = tablelist.id

SQL サーバーは結合を迅速に実行するのに非常に優れているため、これははるかに高速になります。


CTE を使用してこれを行うこともできます。例えば:

WITH tablelist as
(
   SELECT 1 AS id
   UNION ALL
   SELECT 3
   UNION ALL
   SELECT 4
   UNION ALL
   SELECT 5
   UNION ALL
   SELECT 6
   UNION ALL
   SELECT 7
   // More if needed
)
select *
from project
join tablelist on project.project = tablelist.id

これは 1 つの大きなクエリとして送信でき、機能します。唯一の制限はクエリの最大サイズです。そのような制限が存在するかどうかはわかりません。

于 2013-03-14T02:46:46.970 に答える
1

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

は間違った構文です。次のようになります。

select * from project where id in (" + projectIds + ")";
于 2013-03-14T03:52:25.167 に答える