sap hana 占位符使用箭头符号传递 * 参数

sap hana placeholders pass * parameter with arrow notation

尝试在 sql Hana 占位符中使用箭头符号传递星号 (*)

以下工作正常:

 Select *  FROM "table_1"
            ( PLACEHOLDER."$$IP_ShipmentStartDate$$" => '2020-01-01',
              PLACEHOLDER."$$IP_ShipmentEndDate$$" => '2030-01-01' ) 

在下文中,当我尝试传递 * 时,出现语法错误:

   Select *  FROM "table1"
            ( PLACEHOLDER."$$IP_ShipmentStartDate$$" => '2020-01-01',
              PLACEHOLDER.'$$IP_ItemTypecd$$' => '''*''',
              PLACEHOLDER."$$IP_ShipmentEndDate$$" => '2030-01-01' ) 

我使用箭头符号的原因,因为它是我所知道的允许传递参数的唯一方法,如下例所示:

do begin
  declare lv_param nvarchar(100);
  select max('some_date')
    into lv_param
  from dummy /*your_table*/;
  
  select * from "_SYS_BIC"."path.to.your.view/CV_TEST" (
    PLACEHOLDER."$$P_DUMMY$$" => :lv_param
  );
end;

带三引号 '''*''' 的表示法可能会在此处产生 语法错误

而是使用单引号来提供 '*' 字符串。

但这只是这里挑战的一半。

在SQL中,占位符搜索是通过LIKE完成的,占位符是%,而不是*

要在使用计算视图时模仿 ABAP 行为,输入参数 必须用于计算视图中的筛选表达式。而这些 过滤器表达式 必须检查输入参数值是否为 * 。如果是*那么过滤条件需要是LIKE,否则是=(等于)条件。

最后的评论:PLACEHOLDER-语法实际上只适用于计算视图而不适用于表格。

您的代码中有错字。您需要在参数名称周围使用双引号,但您有一个单引号。应该是:PLACEHOLDER."$$IP_ItemTypecd$$".

当您将某些内容传递给计算视图的参数时,您已经有了一个字符串,它将被视为字符串并在需要的地方用引号引起来,因此无需添加更多。但是如果你真的需要在占位符的值中传递一些引号,你还需要用反斜杠对它们进行转义以将它们加倍(这是通过在计算视图上进行数据预览并输入 '*' 作为输入参数的值发现的,然后你会在预览日志中找到有效的 SQL 语句):

do
begin
  select *
  from "_SYS_BIC"."ztest/CV_TEST_PERF"(
    PLACEHOLDER."$$P_DUMMY$$" => '''*'''
  );
end;

/*
SAP DBTech JDBC: [339]: invalid number: : line 3 col 3 (at pos 13): invalid number:
not a valid number string '' at function __typecast__() 
*/

/*And in trace there's no more information, but interesting part
is preparation step, not an execution

w SQLScriptExecuto se_eapi_proxy.cc(00145) : Error <exception 71000339:
not a valid number string '' at function __typecast__()
> in preparation of internal statement:
*/

do
begin
  select *
  from "_SYS_BIC"."ztest/CV_TEST_PERF"(
    PLACEHOLDER."$$P_DUMMY$$" => '\'*\''
  );
end;

/*
SAP DBTech JDBC: [257]: sql syntax error: incorrect syntax near "\": line 5 col 38 (at pos 121)
*/

但这没关系:

do
begin
  select *
  from "_SYS_BIC"."ztest/CV_TEST_PERF"(
    PLACEHOLDER."$$P_DUMMY$$" => '\''*\'''
  );
end;

LOG_ID                    | DATUM    | INPUT_PARAM | CUR_DATE
--------------------------+----------+-------------+---------
8IPYSJ23JLVZATTQYYBUYMZ9V | 20201224 | '*'         | 20201224
3APKAAC9OGGM2T78TO3WUUBYR | 20201224 | '*'         | 20201224
F0QVK7BVUU5IQJRI2Q9QLY0WJ | 20201224 | '*'         | 20201224
CW8ISV4YIAS8CEIY8SNMYMSYB | 20201224 | '*'         | 20201224

星星本身呢:

  • 正如@LarsBr已经说过的,在SQL中你需要使用LIKE '%pattern%'来搜索中间包含parretn的字符串,%相当于ABAP的*(但据我所知,* 在非 SQL 世界中是更冗长的占位符)。所以没有开箱即用的 FIELD = '*'FIELD like '%' 或类似的转换。
  • 但列引擎(在筛选器或计算列中)中没有 LIKE 谓词。

如果您确实需要 LIKE 过滤器或计算列中的功能,您可以:

  • 将执行引擎切换到 SQL
  • 或使用 Column Engine 的 match(arg, pattern) 功能,该功能现在已从托盘中消失并在文档中隐藏得很好(here,在页面的最后,在深入研究table 中最后一行的描述字段,你会找到它的实际语法。该死的!)。

但是在这里你会遇到另一个惊喜:只要Column Engine的运算符不同于SQL(它更内部,更接近DB核心),它使用星号(*) 为通配符。所以对于 match(string, pattern) 你需要再次使用星号:match('pat string tern', 'pat*tern').

综上所述:在某些情况下,您确实想要使用通配符搜索数据并将其作为参数传递。但是然后你需要使用 match 并将参数作为纯文本传递,不要在 star (*) 或其他东西上使用技巧(如果你想使用官方支持的功能,而不是试图利用某些内部机制)。

将此过滤器添加到 我的简历的 RSPCLOGCHAIN 投影节点后,它的工作方式如下:

do
begin
  select *
  from "_SYS_BIC"."ztest/CV_TEST_PERF"(
    PLACEHOLDER."$$P_DUMMY$$" => 'CW*'
  );
end;

LOG_ID                    | DATUM    | INPUT_PARAM | CUR_DATE
--------------------------+----------+-------------+---------
CW8ISV4YIAS8CEIY8SNMYMSYB | 20201224 | CW*         | 20201224


do
begin
  select *
  from "_SYS_BIC"."ztest/CV_TEST_PERF"(
    PLACEHOLDER."$$P_DUMMY$$" => 'CW'
  );
end;

/*
Fetched 0 row(s) in 0 ms 0 µs (server processing time: 0 ms 0 µs)
*/