ABAP 的坑02

作者:ABAP老白 约 3 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, 开发, 数据工程

[ ABAP老白 ](javascript:void\(0\);)

如果说工作区域、变量未清空是ABAP第一坑的话,那么 **FOR ALL ENTRIES** 的坑大概能算得上第二大坑了。

FOR ALL ENTRIES有三个需要注意的地方。

**1、使用前必须判断内表是否为空**

如果内表为空,就会使WHERE条件失效,相当于没有指定任何限制。注意是整个WHERE失效,而不是仅仅FOR ALL ENTRIES的字段。

如下面例子:

ABAP 的坑02 - 封面图
ABAP 的坑02 - 封面图

会取出MAKT所有的数据,而不仅仅是MAKTX等于半成品的。

下面是ST05跟踪的结果:

ABAP 的坑02 - 封面图
ABAP 的坑02 - 封面图

**2、默认的DISTINCT**

FOR ALL ENTRIES是把一个SQL分解成多个SQL去执行,然后把结果汇总去重后返回。这个去重的动作其实就是做一个DISTINCT。

把程序改一下,使得IT_MAT有值:

ABAP 的坑02 - 封面图
ABAP 的坑02 - 封面图

然后运行跟踪一下SQL:

ABAP 的坑02 - 封面图
ABAP 的坑02 - 封面图
ABAP 的坑02 - 封面图
ABAP 的坑02 - 封面图

可以看出FOR ALL

ENTRIES就是把内表的数据依次放到SQL里面,因为IT_MAT可能有重复的值,所以在最终返回的时候要去重,也就是有个DISTINCT的动作,所以,

第一:最好把内表IT_MAT去重后再使用,提高效率

第二:SELECT后面的要有唯一键值的区别度,防止DISTINCT导致数据丢失。

**3、内表大的时候占用内存会很大**

如果IT_MAT很大的话,比如几百万数据,执行这个SQL占用的内存是可观的,有时候会达到内存使用的上限,而且效率很差,所以尽量避免大数据量下使用FOR

ALL ENTRIES。 **

**

ABAP 的坑02 - 封面图
ABAP 的坑02 - 封面图
ABAP老白

关于作者:ABAP老白

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「ABAP的坑02.md」整理生成,仅用于内部技术分享与学习交流。