【问题标题】:Dynamic column name in snowflake雪花中的动态列名
【发布时间】:2021-03-18 14:44:53
【问题描述】:

我是雪花的新手,所以请多多包涵。 我正在尝试做一件非常简单的事情 - 通过文字指定列名,但出现 sql 编译错误 insert into MYDB.MYSCHEMA.MYTABLE (identifier('MYCOLUMN')) values (10);

SQL 编译器指向 MYCOLUMN 之前的意外括号。跳过单词标识符和单引号可以正常工作。

【问题讨论】:

  • 所以如果你打算使用存储过程来构建动态SQL,只需通过存储过程注入列名即可。如果您不是最终目标,那么“掌握使用会话变量”实际上没有任何意义。

标签: snowflake-cloud-data-platform identifier


【解决方案1】:
create table mytable(MYCOLUMN number);
insert into MYTABLE (MYCOLUMN) values (10); 

对我来说很好用。

现在,如果您希望您的列全部是花哨的大小写,而不是不区分大小写并自动大写,您可以将名称用双引号括起来 "AwSoMeName WITH spaces" 是有效的,但也很痛苦。

create table MY_TABLE_2("AwSoMeTable WITH spaces" number);
insert into MY_TABLE_2 ("AwSoMeTable WITH spaces") values (10); 

【讨论】:

  • 谢谢,但这不是我问的。列名应该在一个变量中(或者为了简单起见这里是文字),所以它必须在一个 IDENTIFIER 调用中。最终,此代码用于在设计时不知道列名称的存储过程。标识符 dos for me 用于表名,但不适用于列
  • 由于是存储过程,只要定义SQL语句,使用反引号终止即可。然后,您可以使用${myVariable} 语法替换 SQL 中的任何内容。
  • 编写 sql 语句是不安全的做法,永远不应该使用。可以很容易地传入一个类似于 "myFakecolumn; drop database" 的列名。这就是使用标识符关键字的原因。 (但在我的情况下,它不适用于仅用于表名的列)
  • 作为一个笼统的陈述你错了,如果你在从信息模式中选择的列之间循环,如果在存储过程中编写 sql 有 231% 的安全性,则表/列。但是,是的,用户输入应该始终通过正确的处理函数来避免问题。但是鉴于这个问题对您所做工作的上下文/范围的说明很少,它确实应该被否决/关闭,但这不会发生在 snowflake-cloud-data-platform 标签上。
  • “编写 sql 语句是不安全的做法,永远不应该使用。”
【解决方案2】:

刚刚收到 Snowflake 支持的回复。目前“标识符”仅支持 select 语句。它不适用于用于标识列的插入。它确实适用于识别表 n 选择和插入。

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 2021-05-12
    • 2021-12-26
    • 2021-06-22
    • 2023-01-06
    • 1970-01-01
    • 2022-01-05
    • 2022-01-20
    相关资源
    最近更新 更多