你能将参数传递给匿名块吗?

Can you Pass a parameter to an anonymous block?

提问人:Holmes IV 提问时间:11/17/2023 最后编辑:Holmes IV 更新时间:11/17/2023 访问量:50

问:

我有一个匿名代码块,当我定义测试参数时,它起作用。但是,我真正需要做的是能够将一些东西传递到其中。

在注释掉的第 4 行代码中,您会看到一个 ?mark,这是我在使用会话变量时传递参数的方式。这当然将我限制在 256 位,我需要的远不止于此。

我不确定 Snowflake 怎么会是一家有如此限制的企业公司,所以我开始查看匿名块的 16 MB 限制并使用 VARCHAR。下面的脚本可以运行,但正如我所说,它是硬编码的。我不确定是否存在不同的变量,例如 $?或者 Snowflake 在这些内部使用一些奇怪的东西,类似于他们使用 = 来分配会话但 := 用于块。最终,它将在 SSRS 中被删除,因此用户可以单击“全部”而不会失败,因为列表中有 50 个项目,其中包含 6 个字符。(或其他类似的东西)

EXECUTE IMMEDIATE $$
DECLARE 
    vParameter1 VARCHAR(16777216) := '700,145,138,159';
    --vParameter1 VARCHAR(16777216) := ?;
    res RESULTSET DEFAULT (SELECT 0 AS LOC_ID, 'all' LOC_NAME);
BEGIN
res := (
SELECT    0 AS Loc_ID
        

UNION ALL

SELECT TO_NUMBER(table1.VALUE) AS Loc_ID
FROM TABLE(SPLIT_to_table(:vParameter1,',')) AS table1 

);
RETURN TABLE(res);
END;
$$;

由于匿名块隐藏列名而手动编辑字段的示例。enter image description here

snowflake-云-数据-平台

评论

0赞 NickW 11/17/2023
嗨 - 您能更详细地解释一下“最终,它是如何在 SSRS 中被丢弃的”吗?您打算如何让 SSRS 在工作表中运行匿名代码块?您实际上是在尝试编写 SSRS 可以执行的 UDF 吗?
0赞 Holmes IV 11/17/2023
好吧,我有点掉进了兔子洞。我有脚本使用?标记,并能够将参数从 SSRS 传递到其中。但是,这是使用只有 256 位的会话变量,我们的用户经常单击“全部”或只是选择超过 256 位的太多内容。因此,我尝试定义一个可变长度,并最终得到了上述结果。但是现在我无法将参数传入(或看到列出来)我认为是通过手动定义字段来绕过的。参数虽然是行不通的。因此,与 SSRS 中一样@Paremeter1例如,这是一个包含 200 个位置 ID 的列表。
0赞 NickW 11/17/2023
好的 - 但是您还没有解释如何让 SSRS 运行 Snowflake SQL 的匿名块,这确实是我的问题。你在哪里/如何存储这个 SQL,你如何让 SSRS 执行它,你如何使用它返回的数据,等等?
0赞 Holmes IV 11/17/2023
是的,所以使用上面的脚本,我把它放在 SSRS 中。我收到一个错误,因为它不知道要返回的列。不过,我这样做了,所以我在数据集的“字段”部分中定义了它们,现在我可以让它像使用硬编码值一样用于该查询。现在,我正在尝试通过使用参数代替硬代码来动态化它。在这样做之前,我发现 Snowflake 用过吗?然后设置参数或多值参数的 JOIN(Parameter,“,”) 表达式。所以我试过这个,但是一旦我删除了“700...159”并把?它通过错误?“SQL 存储过程中的未命名绑定。
0赞 Lukasz Szozda 11/18/2023
看起来这里真正的问题不是相关的 Snowflake,而是如何传递多个参数以从 SSRS 查询。为此,您实际上并不需要 Snowflake Scripting 块。使用 Snowflake 数据源在 SSRS 上传递数据参数SELECT TO_NUMBER(table1.VALUE) AS Loc_ID FROM TABLE(SPLIT_to_table(<input_from_SSRS>,',')) AS table1

答: 暂无答案