SAP 多条SQL语句往同一个内表SELECT数据的方法

”定义数据:

DATA it_a LIKE TABLE OF yqz_test001 WITH HEADER LINE.

START-OF-SELECTION.

"往数据表yqz_test001增加基础数据:

it_a-aaa = 'AAA'.
  it_a-bbb = '1'.
 it_a-ccc = 'AAA001'.
  APPEND it_a.

  it_a-aaa = 'BBB'.
  it_a-bbb = '2'.
  it_a-ccc = 'BBB002'.
  APPEND it_a.

  MODIFY yqz_test001 FROM TABLE it_a.
“多次SELECT数据到内表IT_A中去:
  SELECT * FROM yqz_test001 INTO CORRESPONDING FIELDS OF TABLE it_a
    WHERE aaa = 'AAA'.

  SELECT * FROM yqz_test001 APPENDING CORRESPONDING FIELDS OF TABLE it_a
  WHERE aaa = 'BBB'.

总结:可以使用1个SELECT...INTO 和多个 SELECT...APPENDING实现分条件SELECT数据的需求。

<think>我们正在处理用户关于查询SAP的原生SQL语句的请求。根据引用[4],官方建议优先使用Open SQL,仅在必须时使用Native SQL。但用户明确要求原生SQL示例。 引用中提供了几个EXEC SQL的示例(引用[1]和引用[2]),这是ABAP中执行原生SQL的语法结构。 在ABAP中,原生SQL语句通过EXEC SQL和ENDEXEC之间的语句来执行。注意,原生SQL数据库特定的(如Oracle或HANA),并且不会经过SAP的字典缓冲区,因此需要谨慎使用。 示例1(来自引用[1])展示了Oracle的递归查询(CONNECT BY): EXEC SQL. SELECT LEVEL, emp_name FROM employees START WITH manager_id IS NULL CONNECT BY PRIOR emp_id = manager_id ENDEXEC. 示例2(来自引用[1])展示了HANA调用计算视图: EXEC SQL. CALL "_SYS_BIC"."com.sap.demo.CalcView" (?) ENDEXEC. 示例3(来自引用[2])展示了在HANA中调用函数SESSION_CONTEXT: EXEC SQL. SELECT SESSION_CONTEXT('CLIENT') INTO :lv_client FROM DUMMY ENDEXEC. 因此,我们可以给用户提供查询SAP的原生SQL示例(以HANA为例): EXEC SQL. SELECT * FROM "SCHEMA"."TABLE_NAME" ENDEXEC. 注意: 1. 名和模式名(SCHEMA)需要用双引号括起来(如果包含小写字母或特殊字符,则必须使用双引号,且区分大小写)。 2. 在ABAP中,我们通常使用冒号(:)来绑定变量(如上面的:lv_client)。 3. 在SAP系统中,通常属于某个模式,比如SAP系统大多属于"SAPABAP1"(取决于系统配置),自定义则属于创建时的模式。但在ABAP中,我们通常通过透明(DDIC)访问,而透明数据库上对应一个物理,其模式名由系统配置决定。 然而,用户可能更关心如何查询ABAP字典中定义的(透明)。在ABAP中,我们一般不直接使用原生SQL查询透明,因为透明的物理名和模式名可能因系统而异。但如果我们知道物理名和模式名,可以这样写: EXEC SQL. SELECT MANDT, MATNR, MTART INTO :wa_mara FROM "SAPABAP1"."MARA" WHERE MANDT = :sy-mandt AND MATNR LIKE :matnr_pattern ENDEXEC. 但是,请注意: - 物理名通常与ABAP字典中的名相同(但大小写不一定),在HANA中默认是大写。 - 模式名(Schema)在SAP系统中通常由系统配置决定,比如在HANA上,标准系统模式为"SAPABAP1"(或类似,具体请查看系统配置)。在Oracle系统中,模式名通常是SAP的SID(如DEV、PRD等)。 - 使用原生SQL时,不能使用ABAP数据字典的缓冲区,也不能保证与SAP的升级兼容性(例如物理名可能会变化)。 因此,我们建议仅在Open SQL无法满足需求(如调用特定数据库的函数、特殊语法等)时才使用原生SQL。 另外,引用[4]还提到了调试与监控工具链(如ST05用于SQL跟踪),这对于分析实际执行的SQL语句很有帮助。 根据上述内容,我们为用户提供示例。 注意:在ABAP中,使用EXEC SQL时,语句必须符合数据库的语法(这里是HANA或Oracle等)。 示例:查询MARA(物料主数据)的原生SQL语句(HANA数据库): DATA: lv_mandt TYPE mandt, lv_matnr TYPE matnr, lv_mtart TYPE mtart. EXEC SQL. SELECT MANDT, MATNR, MTART INTO :lv_mandt, :lv_matnr, :lv_mtart FROM "SAPABAP1"."MARA" WHERE MANDT = '100' AND MATNR = 'MAT001' ENDEXEC. 或者,如果使用结构体: DATA: wa_mara TYPE mara. EXEC SQL. SELECT MANDT, MATNR, MTART INTO :wa_mara FROM "SAPABAP1"."MARA" WHERE MANDT = '100' AND MATNR = 'MAT001' ENDEXEC. 注意:结构体wa_mara必须包含与查询字段顺序和数量对应的组件,并且类型兼容。 但是,请注意,在ABAP中,我们通常使用Open SQL来查询,例如: SELECT SINGLE mandt, matnr, mtart FROM mara WHERE mandt = '100' AND matnr = 'MAT001' INTO @wa_mara. 除非有特殊需求(比如使用HANA特定的函数或特性),否则建议使用Open SQL。 根据引用[4]:多关联简单场景使用Open SQL JOIN,复杂场景使用CDS View(性能更好)。 总结:用户要求原生SQL示例,我们提供了,但同时我们也应该提醒用户谨慎使用原生SQL,并优先考虑Open SQL。 相关问题: 1. 如何在ABAP中执行原生SQL语句? 2. 使用原生SQL查询SAP时有哪些注意事项? 3. 如何确定SAP数据库中的物理名称和模式? 4. 如何通过SQL Trace(ST05)分析执行的SQL语句? </think>以下是查询 SAP 的原生 SQL 语句示例及关键说明(基于 ABAP 平台的 Native SQL 语法): ### 原生 SQL 语法结构 ```abap EXEC SQL. SELECT <字段> INTO :<变量> FROM <物理名> WHERE <条件> ENDEXEC. ``` ### 示例代码 1. **单行查询(Oracle/HANA 通用)** ```abap DATA: lv_matnr TYPE matnr. EXEC SQL. SELECT MATNR INTO :lv_matnr FROM "SAPABAP1"."MARA" -- 物理名需大写并用双引号 WHERE MANDT = '100' AND MATNR = 'MATERIAL_001' ENDEXEC. ``` 2. **多字段查询(HANA 语法)** ```abap DATA: ls_mara TYPE mara. EXEC SQL. SELECT MANDT, MATNR, MTART INTO :ls_mara FROM "SAPABAP1"."MARA" WHERE MTART = 'HAWA' FETCH FIRST 1 ROWS ONLY ENDEXEC. ``` 3. **动态名查询(特殊场景)** ```abap DATA: lv_table TYPE string VALUE 'MARA', lv_value TYPE string. EXEC SQL. EXECUTE IMMEDIATE 'SELECT MTART FROM ' || :lv_table || ' WHERE MATNR = ''MATERIAL_001''' INTO :lv_value ENDEXEC. ``` ### 关键注意事项 1. **物理名规则** - 需通过事务码 `SE11` 查看的技术设置获取 **真实物理名**(如 `MARA` 实际可能是 `SAPABAP1.MARA`) - 必须使用**大写和双引号**包裹名(例如 `"SAPABAP1"."MARA"`)[^4] 2. **变量绑定** - 宿主变量需以冒号开头(`:lv_matnr`) - INTO 子句变量需与 SELECT 字段顺序严格匹配 3. **客户端处理** - 必须显式包含 `MANDT`(客户端)字段的条件(如 `WHERE MANDT = '100'`) - 避免全客户端查询导致的性能问题[^4] 4. **替代方案优先级** ```mermaid graph LR A[数据查询] --> B{是否标准操作} B -->|是| C[Open SQL] B -->|否| D{是否涉及DB特性} D -->|是| E[Native SQL] D -->|否| F[CDS View] ``` **官方建议**:优先使用 Open SQL,仅以下场景使用 Native SQL[^4]: - 数据库特有函数(如 HANA 的 `SESSION_CONTEXT`[^2]) - 递归查询(Oracle `CONNECT BY`[^1]) - 存储过程调用(`CALL "_SYS_BIC"."..."`[^1]) ### 调试建议 1. 使用 **ST05 (SQL Trace)** 跟踪实际执行的 SQL 2. 在 **HANA Database Explorer** 中验证语法(需订阅 Administration Tools[^3]) 3. 关键事务码: - `SE11`:查看物理名称 - `SE16`:数据浏览器(辅助验证) - `ST05`:SQL 性能分析 > ⚠️ **风险提示**:Native SQL 绕过 SAP 应用层缓冲和安全检查,可能导致: > - 数据库锁冲突 > - 客户端数据混淆 > - 升级兼容性问题(结构变更时不自动报错)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值