Sql 向存储过程输入一个列表

Sql 向存储过程输入一个列表,sql,hana,Sql,Hana,我从R中得到一个元素列表,我必须从数据库中获得属于元素列表的记录 输入: '12345','23456', '34567', '45678' 程序: CREATE PROCEDURE "SCHEMA"."GET_RECORDS" (IN LIST (Type), OUT RECORDS tt_records) LANGUAGE SQLSCRIPT SQL SECURITY INVOKER READS SQL DATA AS BEGIN RECORDS =

我从R中得到一个元素列表,我必须从数据库中获得属于元素列表的记录

输入:

'12345','23456', '34567', '45678'
程序:

   CREATE PROCEDURE "SCHEMA"."GET_RECORDS" (IN LIST (Type), OUT RECORDS tt_records)
   LANGUAGE SQLSCRIPT
    SQL SECURITY INVOKER 
READS SQL DATA AS
    BEGIN
    RECORDS = select * from TABLE where ids in :LIST
    END;

如何向proceudre提供这样的列表?

使用用户定义的数据类型

首先创建一个用户定义的数据类型

数据库节点>可编程性>类型>用户定义的表类型

脚本:

CREATE TYPE dbo.MyTableType AS TABLE 
(
    ID INT
)
使用上述类型在过程中创建参数

CREATE PROCEDURE usp_InsertMessages 
(
    @MyParameter MyTableType READONLY
)
AS
BEGIN

    INSERT INTO MyTable
    (
       id
    )
    SELECT 
       id
       FROM @MyParameter 

END

使用用户定义的数据类型

首先创建一个用户定义的数据类型

数据库节点>可编程性>类型>用户定义的表类型

脚本:

CREATE TYPE dbo.MyTableType AS TABLE 
(
    ID INT
)
使用上述类型在过程中创建参数

CREATE PROCEDURE usp_InsertMessages 
(
    @MyParameter MyTableType READONLY
)
AS
BEGIN

    INSERT INTO MyTable
    (
       id
    )
    SELECT 
       id
       FROM @MyParameter 

END

将参数列表移交给SQLScript有点棘手,因为没有直接的本机构造

一种方法是使用
APPLY_FILTER
函数并将列表作为字符串参数“走私”

在我的示例中,我从表
CUSERS
中读取,并为
APPLY\u filter
创建一个过滤条件,该条件通过
In()
子句过滤列
USER\u ID

从列表中删除单引号(
'
)是为了避免在执行查询时进行隐式类型转换。保留单引号将使()中的
子句make如下所示:
IN(“”,“”,“…)

而不是
(,…)中的

将数据从SAP HANA导出到R中的一种稍微舒适的方法是使用表类型的用户定义函数(UDF)。这里的主要区别在于调用语句是一个简单的
SELECT
,结果就是这个
SELECT
的结果集

CREATE function  "FGET_RECORDS" (IN id_list VARCHAR(4000))
returns  tt_cusers
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER 
    READS SQL DATA AS
BEGIN
declare _filter VARCHAR(4000);

    _users = select * from cusers;

    -- APPLY_FILTER expects a proper WHERE condition, so adding the column to filter
    -- and the IN () expression is necessary.
    -- 
    -- the the id_list comes in with single quotes, let's remove those

    _filter = 'USER_ID in (' || replace (:id_list, '''', '') ||')';
    _result = APPLY_FILTER(:_users, :_filter);    
    RETURN :_result;
end;    


select * from fget_records (? );
R
(或任何其他客户端)中,确保在使用此构造时使用绑定变量。否则,处理不同的字符串引用机制可能会变得很麻烦


请参阅
APPLY\u FILTER

上的文档,将参数列表移交给SQLScript有点棘手,因为没有直接的本机构造

一种方法是使用
APPLY_FILTER
函数并将列表作为字符串参数“走私”

在我的示例中,我从表
CUSERS
中读取,并为
APPLY\u filter
创建一个过滤条件,该条件通过
In()
子句过滤列
USER\u ID

从列表中删除单引号(
'
)是为了避免在执行查询时进行隐式类型转换。保留单引号将使()中的
子句make如下所示:
IN(“”,“”,“…)

而不是
(,…)中的

将数据从SAP HANA导出到R中的一种稍微舒适的方法是使用表类型的用户定义函数(UDF)。这里的主要区别在于调用语句是一个简单的
SELECT
,结果就是这个
SELECT
的结果集

CREATE function  "FGET_RECORDS" (IN id_list VARCHAR(4000))
returns  tt_cusers
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER 
    READS SQL DATA AS
BEGIN
declare _filter VARCHAR(4000);

    _users = select * from cusers;

    -- APPLY_FILTER expects a proper WHERE condition, so adding the column to filter
    -- and the IN () expression is necessary.
    -- 
    -- the the id_list comes in with single quotes, let's remove those

    _filter = 'USER_ID in (' || replace (:id_list, '''', '') ||')';
    _result = APPLY_FILTER(:_users, :_filter);    
    RETURN :_result;
end;    


select * from fget_records (? );
R
(或任何其他客户端)中,确保在使用此构造时使用绑定变量。否则,处理不同的字符串引用机制可能会变得很麻烦


<文件>关于代码> Apple YouthFux .< /P>是的,它不是,我删除了标签,它是SAP HANAYEAH的语法,不是,我删除了标签,它是SAP HANAAN的语法,意思是,它把列表看作列吗?是的,它是列中的一个列,你确信这是SAP HANA的有效语法吗?不完全,列表需要一个类型,我想找到它。@jayasuryasathesh然后我必须创建一个tableín R。我需要一种方法来按原样处理列表。我没有编写一个新表的WordPrimeLiges。这意味着,它把列表看作一个列吗?是的,它将是表中的一个列。您确信这是SAP HANA的有效语法吗?不完全是,列表需要一个类型,我想找出它。@ JayasuryasathEx,然后我必须创建一个表In R。我需要一种方法来获取列表的方式。我没有写新表的权限。