hana上的UPSERT SP可以:1.插入新行。 2.在每个sp调用上更新*不同的列*

2020-09-02 01:22发布

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

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


我有一个表格,其中包含以下列:ID,姓名,年龄,地址。

我想在hana上做一个UPSERT SP,可以做到:

  1. 插入新行。
  2. 在每个sp调用中
  3. 更新不同列。

SP看起来像这样:

  PROCEDURE UPSERT_SP(
    ID varchar(10),
    NAME varchar(20),
    AGE int,
    地址varchar(50)

BEGIN UPSERT" MT_TABLE" AS MT VALUES(
:ID,
IFNULL(:NAME,MT。" NAME"),
IFNULL(:AGE,MT。" AGE"),
IFNULL(:ADDRESS, MT。" ADDRESS")))
MT。" GUID" =:GUID;
END;

现在,如果我打电话给我的SP,我希望发生这种情况:

  • 调用UPSERT_SP('new_id','new_name',55,'new_address')-表中不存在'new_id',因此将创建新行。
  • CALL UPSERT_SP('new_id',null,100,null)-表中存在'new_id',因此'new_id'行将仅更新AGE列,因为其他两个(名称,地址)均为'null'

我知道我编写的sp在SQL Server Manager中有效,但是由于某种原因,SAP HANA不允许我这样做。 当我尝试激活sp时,出现以下错误:

不允许的列:MT.NAME

如何获得想要达到的结果(我已经使用子查询尝试过UPSERT,但没有用)。

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

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


我有一个表格,其中包含以下列:ID,姓名,年龄,地址。

我想在hana上做一个UPSERT SP,可以做到:

  1. 插入新行。
  2. 在每个sp调用中
  3. 更新不同列。

SP看起来像这样:

  PROCEDURE UPSERT_SP(
    ID varchar(10),
    NAME varchar(20),
    AGE int,
    地址varchar(50)

BEGIN UPSERT" MT_TABLE" AS MT VALUES(
:ID,
IFNULL(:NAME,MT。" NAME"),
IFNULL(:AGE,MT。" AGE"),
IFNULL(:ADDRESS, MT。" ADDRESS")))
MT。" GUID" =:GUID;
END;

现在,如果我打电话给我的SP,我希望发生这种情况:

  • 调用UPSERT_SP('new_id','new_name',55,'new_address')-表中不存在'new_id',因此将创建新行。
  • CALL UPSERT_SP('new_id',null,100,null)-表中存在'new_id',因此'new_id'行将仅更新AGE列,因为其他两个(名称,地址)均为'null'

我知道我编写的sp在SQL Server Manager中有效,但是由于某种原因,SAP HANA不允许我这样做。 当我尝试激活sp时,出现以下错误:

不允许的列:MT.NAME

如何获得想要达到的结果(我已经使用子查询尝试过UPSERT,但没有用)。

付费偷看设置
发送
2条回答
Bunny_CDM
1楼-- · 2020-09-02 01:37

似乎您正在尝试实现UPSERT查询忽略NULL值。 如果我们不加修改地使用UPSERT查询,我们希望在第二次执行过程中,除老化之外,还会更新new_name和new_address(值将为NULL)。 要实施这种解决方法,您可以查看以下代码段示例:

过程" UPSERT_SP"(
 ID varchar(10),
 NAME varchar(20),
 AGE int,
 地址varchar(50)
 )
 语言SQLSCRIPT
 SQL安全调用程序
 如
 开始
 lt_existing_values =选择ID,
 IFNULL(:NAME,NAME)AS NAME,
 IFNULL(:AGE,AGE)作为年龄,
 IFNULL(:ADDRESS,ADDRESS)作为地址
 FROM" test.mt_tables"其中id =:id;

 如果IS_EMPTY(:lt_existing_values)然后
 插入" test.mt_tables"值(:ID,:NAME,:AGE,:ADDRESS);
 其他
 UPSERT" test.mt_tables"从:lt_existing_values选择ID,名称,年龄,地址;
 万一;
 结束
 
Climb_Ma
2楼-- · 2020-09-02 01:47

对,没有执行我的代码。 为什么您可以简单地按设计使用UPSERT并传递而不是实际相同值的NULL值? 如果有特定要求并且您仍然需要它-您始终可以使用SQLScript的功能并检查值是否为空-

过程" UPSERT_SP"(
 ID varchar(10),
 NAME varchar(20),
 AGE int,
 地址varchar(50)
 )
 语言SQLSCRIPT
 SQL安全调用程序
 如
 开始
 lt_existing_values =选择ID,
 IFNULL(:NAME,NAME)AS NAME,
 IFNULL(:AGE,AGE)作为年龄,
 IFNULL(:ADDRESS,ADDRESS)作为地址
 FROM" test.mt_tables"其中id =:id;

 如果IS_EMPTY(:lt_existing_values)然后
 插入" test.mt_tables"值(:ID,:NAME,:AGE,:ADDRESS);
 其他
 UPSERT" test.mt_tables"从:lt_existing_values选择ID,名称,年龄,地址;
 万一;
 结束
 

一周热门 更多>