Files
sap-cli-skill/log/adt-nw740-open-sql-consistency.md
T

90 lines
2.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "NW 7.40 Open SQL @ 转义一致性错误"
created: 2026-08-05
updated: 2026-08-05
type: error
tags: [adt, sap, error, nw740, open-sql, syntax]
adt_endpoint: syntax-check
nw_version: 7.40
confidence: high
contradictions: []
---
# NW 7.40 Open SQL @ 转义一致性错误
## 症状
```
✗ 语法检查未通过! 2 个错误, 0 个警告
[错误] 行 1: If the new Open SQL syntax is used, it must be used throughout.
This includes using @ to escape host variables.
[错误] 行 2: When escaped, all host variables must be escaped using @.
```
## 根因
NW 7.40 要求 Open SQL 中的 `@` 转义**全局一致**
- 如果在任何一个 SELECT 语句中使用了 `@`(如 `WHERE field = @lv_var`),则**所有** SELECT 语句的 INTO 子句也必须使用 `@``INTO TABLE @lt_data`
- 反之,如果不用 `@`,全都不用
- **混用会导致语法检查失败**
典型触发场景:将 `@DATA(...)` inline 声明改为传统 `DATA` 声明时,误把 `@` 一起删了。
```abap
" ❌ 错误 — 混用
SELECT * FROM ztable WHERE field = @lv_var INTO TABLE lt_data.
" ✅ 正确 — 全部用@
SELECT * FROM ztable WHERE field = @lv_var INTO TABLE @lt_data.
" ✅ 同样正确 — 全部不用@ (NW 7.40 传统风格)
SELECT * FROM ztable WHERE field = lv_var INTO TABLE lt_data.
```
## 解决方案
**步骤 1**:检查源码中所有 `@` 使用情况
```bash
grep -n "@" program.abap | grep -v "^\*"
```
**步骤 2**:确保一致性
- 如果大部分语句已用 `@`:给少数未用的补上 `@`
```bash
sed -i 's/INTO TABLE lt_/INTO TABLE @lt_/g' program.abap
```
- 如果决定不用 `@`(纯 7.40 传统风格):删掉所有 `@`
```bash
sed -i 's/@\(lv_\|ls_\|lt_\|p_\|s_\|abap_\)/\1/g' program.abap
```
**步骤 3**:重新语法检查
```bash
python main.py syntax-check --name ZXXX --type report
```
## 注意事项
- `CONCATENATE ... INTO`(字符串操作)不需要 `@`
- `LOOP AT ... INTO`(内表循环)不需要 `@`
- `CATCH ... INTO`(异常处理)不需要 `@`
- **只有 SELECT 语句的 INTO/WITH 子句受此规则约束**
## 代码示例
```abap
" 修复前(混用→语法错误)
DATA lt_data TYPE STANDARD TABLE OF ztable.
SELECT * FROM ztable WHERE field = @lv_var INTO TABLE lt_data. " WHERE有@, INTO没有
" 修复后(一致)
SELECT * FROM ztable WHERE field = @lv_var INTO TABLE @lt_data. " 全部用@
```
## 相关错误
- [[adt-set-source-500]] — 传输请求无对象导致写入失败