具有非严格SQL动态形式的运行时错误,但非具有静态形式的运行时错误

2020-09-16 15:55发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

在我的ABAP 7.52 SP 0系统中,使用动态非严格SQL的以下代码出现运行时错误:

数据lines_of_stxh stxh的类型表。
   TYPE字符串中的DATA。
   DATA其中TYPE字符串。

   来自='STXH AS CGT'。
   其中=`EXISTS(SELECT * FROM CVI_CUST_LINK AS O WHERE CGT〜TDNAME = O〜CUSTOMER`
       &&`和CGT〜TDOBJECT ='KNA1'并且存在(SELECT * FROM BUT000 AS H HHERE`
       &&`O〜PARTNER_GUID = H〜PARTNER_GUID AND H〜PARTNER ='0000100549'))。

   选择*从(从)
     插入表格lines_of_stxh
     哪里(哪里)。

简短的转储是一个SAPSQL_PARSE_ERROR(未捕获的CX_SY_DYNAMIC_OSQL_SEMANTICS),带有错误分析"如果使用新的Open SQL语法,则必须始终使用它。这包括使用@来转义主机变量。"

简短的转储是正确的,当我以这种方式编写SELECT时它可以工作-但这不是我的问题:

 SELECT * FROM(来自)
     插入表@lines_of_stxh
     哪里(哪里)。

我的问题是关于相同的非严格SQL,但形式为STATIC,可以编译并正常工作:

数据lines_of_stxh stxh的类型表。

  选择*从stxh AS cgt
  插入表格lines_of_stxh
  在哪里存在(SELECT * FROM cvi_cust_link AS o在哪里cgt〜tdname = o〜customer
  AND cgt〜tdobject ='KNA1'AND EXISTS(SELECT * FROM but000 AS h WHERE在哪里
  o〜partner_guid = h〜partner_guid AND h〜partner ='0000100549'))。
 

因此,静态表单有效,动态表单失败(在非严格模式下)。

您是否认为这是ABAP错误,还是在ABAP官方文档中说明了限制?

我已经搜索了论坛和SAP注释,但是什么也找不到。

(请不要告诉我代码很丑或很复杂,我知道,谢谢:))

编辑:对不起,我在原始标题中犯了一个错误,问题出在非严格模式下(我的问题不是关于使用严格模式)。

谢谢!

桑德拉

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

在我的ABAP 7.52 SP 0系统中,使用动态非严格SQL的以下代码出现运行时错误:

数据lines_of_stxh stxh的类型表。
   TYPE字符串中的DATA。
   DATA其中TYPE字符串。

   来自='STXH AS CGT'。
   其中=`EXISTS(SELECT * FROM CVI_CUST_LINK AS O WHERE CGT〜TDNAME = O〜CUSTOMER`
       &&`和CGT〜TDOBJECT ='KNA1'并且存在(SELECT * FROM BUT000 AS H HHERE`
       &&`O〜PARTNER_GUID = H〜PARTNER_GUID AND H〜PARTNER ='0000100549'))。

   选择*从(从)
     插入表格lines_of_stxh
     哪里(哪里)。

简短的转储是一个SAPSQL_PARSE_ERROR(未捕获的CX_SY_DYNAMIC_OSQL_SEMANTICS),带有错误分析"如果使用新的Open SQL语法,则必须始终使用它。这包括使用@来转义主机变量。"

简短的转储是正确的,当我以这种方式编写SELECT时它可以工作-但这不是我的问题:

 SELECT * FROM(来自)
     插入表@lines_of_stxh
     哪里(哪里)。

我的问题是关于相同的非严格SQL,但形式为STATIC,可以编译并正常工作:

数据lines_of_stxh stxh的类型表。

  选择*从stxh AS cgt
  插入表格lines_of_stxh
  在哪里存在(SELECT * FROM cvi_cust_link AS o在哪里cgt〜tdname = o〜customer
  AND cgt〜tdobject ='KNA1'AND EXISTS(SELECT * FROM but000 AS h WHERE在哪里
  o〜partner_guid = h〜partner_guid AND h〜partner ='0000100549'))。
 

因此,静态表单有效,动态表单失败(在非严格模式下)。

您是否认为这是ABAP错误,还是在ABAP官方文档中说明了限制?

我已经搜索了论坛和SAP注释,但是什么也找不到。

(请不要告诉我代码很丑或很复杂,我知道,谢谢:))

编辑:对不起,我在原始标题中犯了一个错误,问题出在非严格模式下(我的问题不是关于使用严格模式)。

谢谢!

桑德拉

付费偷看设置
发送
4条回答
灬番茄
1楼 · 2020-09-16 16:14.采纳回答

找到它(要求Open SQL的高手)。 动态WHERE中的子查询已在7.40 SP08中引入。

https://help.sap .com/http.svc/rc/abapdocu_752_index_htm/7.52/zh-CN/index.htm?file = abenopensql_strict_mode_740_sp08.htm

因此,您实际上使用了一些新内容,并且在动态情况下会触发严格模式。

hongfeng1314
2楼-- · 2020-09-16 15:59

哦,这很有意义。 我没有意识到那些"新"功能(已经以静态形式存在,并已迁移到动态形式)是否需要切换到严格模式。

非常感谢ABAP和Open SQL的大师! :)

SC_Yao
3楼-- · 2020-09-16 16:17

据我所知,在您的静态SQ中,您根本不执行语法检查的严格模式。 放e。 G。 其他子句后面的INTO子句会爆炸!

请参见 https ://help.sap.com/http.svc/rc/abapdocu_752_index_htm/7.52/zh-CN/index.htm?file = abenopensql_strict_modes.htm

SKY徐
4楼-- · 2020-09-16 16:25

好的,我知道了。

无法解释区别。

会询问Open SQL PO

一周热门 更多>