如何通过从 SAP HANA 中的 Table 函数映射的输入参数传递多个条目

How do I pass multiple entries through an input parameter mapped from a Table Function in SAP HANA

如何通过从 SAP HANA 中的 Table 函数映射的输入参数传递多个条目? 我写了一个 Table 函数,输入参数是 IN_FORMAT_CD。 我已将此参数映射到在我的计算视图中创建的参数。 当我只传递一个值(比如 100)时,我能够检索数据。 但是当我传递多个值时,它不会给出任何结果。 是否有相同的解决方法?

我的table函数:

FUNCTION "HADMIN"."RA.Test.Prathamesh::PH_DEMO" (IN IN_FORMAT_CD NVARCHAR(500)) 
    RETURNS TABLE (NAME NVARCHAR(10), ID NVARCHAR(10), FORMAT_CD NVARCHAR(3))
    LANGUAGE SQLSCRIPT
    SQL SECURITY INVOKER AS
BEGIN
RETURN

SELECT NAME,ID,FORMAT_CD
FROM
HADMIN.PH_DEMO
WHERE FORMAT_CD IN (select :IN_FORMAT_CD as FORMAT_CD from dummy);

END;

不可能从单个 sql 变量中生成(!)多个项目,除非您拆分它们

在您的 SQL 子选择查询中,将 return 只有 FORMAT_CD 列值与 IN_FORMAT_CD 参数完全相同的行。

如果此参数表示多个值,则此参数是每个子项的串联字符串表示。所以我们可以把它们分开。 拆分将动态生成一个 table 可用于选择。

请创建 user-defined HANA Split function fnsplit 源代码可在参考文档

假设每个值都用“,”与其他值分隔,那么您可以如下更改函数

ALTER FUNCTION "HADMIN"."RA.Test.Prathamesh::PH_DEMO" (IN IN_FORMAT_CD NVARCHAR(500)) 
    RETURNS TABLE (NAME NVARCHAR(10), ID NVARCHAR(10), FORMAT_CD NVARCHAR(3))
    LANGUAGE SQLSCRIPT
    SQL SECURITY INVOKER AS
BEGIN
RETURN

SELECT NAME,ID,FORMAT_CD
FROM
HADMIN.PH_DEMO
WHERE FORMAT_CD IN (
    select str from fnsplit(:IN_FORMAT_CD,',')
);

END;

您要查找的是APPLY_FILTER function of SAP HANA SQLScript

以下示例显示了如何对您的场景进行编码:

create function get_vals (IN id_list varchar(400))
returns table (id bigint, val varchar(40)) 
as
begin
declare myfilter varchar(450) := ' ID in (' || :id_list || ')';

 _tmp  = select id, val from some_vals;
 _tmp2 = APPLY_FILTER (:_tmp, :myfilter);

 return :_tmp2;
end;

select * 
from 
get_vals ('1, 4, 23, 4, 23, 3');

此方法将在读取 table 数据时将唯一 ID 列表下推以用作过滤器。然而,这仍然是dynamic SQL so you lose benefits like plan sharing and risk SQL injection attacks. Read more on this e.g. here

如果可能,您希望在应用程序代码中处理选择列表。 反过来,这也让您可以选择使用 IN-lists 还是针对临时 table 的内部联接是最适合您情况的方法。

如果您想将选择列表作为字符串使用,您至少应该确保未使用常见的 SQL 注入攻击并且 "in-list" 实际上只包含可能的ID 值和逗号。