0

当我试图打开页面时,我收到“返回:8011 - SQL 语句太长”的错误。我们有大约数百万行。

在页面上,我们正在填充滚动,并且创建了类似这样的 where 语句

For &i = 1 To &rs.ActiveRowCount

&PARAM1 = &rs(&i).Record.SETID.Value;

&PARAM2 = &rs(&i).Record.VENDOR_ID.Value;

&strWhere = &strWhere | " OR ";

&strWhere = &strWhere | "(SETID = " | "'" |(&PARAM1) | "'" | " AND VENDOR_ID = " | "'" |(&PARAM2) | "'" | ")";

End-for;   

进行滚动选择时有限制吗?

4

2 回答 2

1
  1. 以填充 &rs 的 SQL 为例。
  2. 修改使用 &strWhere 连接到 &rs 记录的 SQL,该记录的过滤方式与您填充 &rs 的方式相同。

解释起来有点棘手,因为您需要更改的不仅仅是代码片段。

修改您的代码,使其更像这样:

&strWhere = ", PS_SOME_RECORD b where b.keyfield_1 = :1 and b.keyfield_2 = :2 ";
&strWhere = &strWhere | "and b.setid = a.setid ";
&strWhere = &strWhere | "and b.vendorid = a.vendorid";

相识又有差别:

&strWhere = " inner join PS_SOME_RECORD b on b.setid = a.setid and b.vendor_id = a.vendor_id ";
&strWhere = &strWhere | "and b.keyfield_1 = :1 and b.keyfield_2 = :2";

基本上:使用数据库而不是尝试构建 1,000,000 行 SQL 语句。

最终你想从数据库(假设 VENDOR 表)返回一些类似的东西:

select *
from ps_vendor a
    inner join ps_your_rs_table b 
    on b.setid = a.setid 
    and b.vendor_id = a.vendor_id
where b.some_field = [your filter/predicates] 
于 2018-05-26T04:17:49.613 回答
0

这是由于在 where 条件“IN”中传递的值的长度。

由于 IN("") 中传入的数据值超过了限制,因此导致了这个错误。

于 2019-04-22T12:44:09.043 回答