使用定义长度的变量创建 Snowflake 查询?

Create Snowflake Query with Variables of defined Length?

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

问:

我知道我可以在存储过程中执行此操作。但是,每当我只是创建一个基本查询时,Snowflake 让我使用的只是“设置 vParmeter1 = ”;命令 这限制了我 256 个字符,这是有限制的。我知道 varchar 最高可达 16mb,如 DECLARE vParameter VARCHAR(16777216);我已经在我的程序中使用了它。我无法弄清楚的是如何在脚本中使用它。我一直在尝试将哪些有效和哪些“应该”有效相结合,但出于某种原因,Snowflake 喜欢重写如何编写 SQL 书籍。在我的代码下面出错和 VARCHAR(),如果你注释掉 声明 它可以工作。第二组被注释掉了,我看到别人在用,所以我试过了,但它从来没有到达那里,所以我把它关掉了。错误是 EOF 第 1 行,就在 varchar 大小的最后 6 行。我还尝试将 varchar 大小减少到 30 左右,但只是更改了错误位置。

  DECLARE   vParameter1 VARCHAR(16777216);

SET vParameter1 = '700,145,138,159';
--SET vParameter1 := '700,145,138,159';

SELECT TO_NUMBER(table1.VALUE) AS Locations
FROM TABLE(SPLIT_to_table($vParameter1,',')) AS table1

以下是在我的机器上对我有用的最终答案,基于对赞成答案的帮助。

EXECUTE IMMEDIATE $$
DECLARE 
  vParameter1 VARCHAR(16777216) := '700,145,138,159';
  res RESULTSET;
BEGIN 
  -- alternative to declare block
  -- LET vParameter1 VARCHAR(16777216) := '700,145,138,159'; 
 
  res := (
    SELECT TO_NUMBER(table1.VALUE) AS Locations
    FROM TABLE(SPLIT_to_table(:vParameter1,',')) AS table1
  );

  /* -- if no resultset is expected then simply:
  INSERT INTO some_table(col)
  SELECT TO_NUMBER(table1.VALUE) AS Locations
  FROM TABLE(SPLIT_to_table(:vParameter1,',')) AS table1;
  */

  RETURN TABLE(res);
END;
$$;
snowflake-云-数据-平台

评论

0赞 Holmes IV 11/17/2023
实际上,我打开了大约最后一个小时,但真的不明白。我有机会用 Karma 贿赂你重写上面的查询格式吗?我假设表格不是强制性的。这只是在那个例子中。我的实际查询中大约有 10 个变量,有些使用 Split,有些只是单个值。

答:

1赞 Lukasz Szozda 11/17/2023 #1

会话变量 () != 块变量 ()。会话变量的硬限制为 256 字节。SETDECLARE/LET

使用块变量:

DECLARE 
  vParameter1 VARCHAR(16777216) := '700,145,138,159';
  res RESULTSET;
BEGIN 
  -- alternative to declare block
  -- LET vParameter1 VARCHAR(16777216) := '700,145,138,159'; 
 
  res := (
    SELECT TO_NUMBER(table1.VALUE) AS Locations
    FROM TABLE(SPLIT_to_table(:vParameter1,',')) AS table1
  );

  /* -- if no resultset is expected then simply:
  INSERT INTO some_table(col)
  SELECT TO_NUMBER(table1.VALUE) AS Locations
  FROM TABLE(SPLIT_to_table(:vParameter1,',')) AS table1;
  */

  RETURN TABLE(res);
END;

输出:

enter image description here

相关:

评论

0赞 Holmes IV 11/17/2023
嗯,在第 2 行仍然出现错误,在 Snowflake web 和 Dbeaver 中都尝试过。SQL 编译错误:位置 53 处的语法错误行 2 意外的“<EOF>”。
0赞 Lukasz Szozda 11/17/2023
docs.snowflake.com/en/developer-guide/snowflake-scripting/......- 请尝试 Snowsight UI 或EXECUTE IMMEDIATE $$ <block here> $$;
0赞 Holmes IV 11/17/2023
这些雪花人疯了。非常感谢您的帮助。为什么有人会去他们的产品,我永远不会知道。非常感谢。