【问题标题】:Escape special characters in snowflake procedure在雪花程序中转义特殊字符
【发布时间】:2020-01-24 13:12:39
【问题描述】:

我正在尝试创建将生成 SQL 代码减去已定义列的函数。 问题在于 ' 字符,它通过给出错误来损坏整个代码:

unexpected 'SELECT'. syntax error line 2 at position 94 unexpected 'as'.

嵌套 SQL 没有问题,将其嵌套到 UDF 中就是问题所在。

CREATE OR REPLACE FUNCTION GET_SQL_TBL_MINUS_COL(tbl varchar, col varchar)
RETURNS VARCHAR(255)
AS

$$
SELECT 'SELECT ' || array_to_string(ARRAY_AGG(c.column_name),',') || ' FROM ' || c.table_name as STMT
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.table_name = tbl  --table name
AND   c.column_name NOT IN(col) --column name
GROUP BY c.table_name;
$$

【问题讨论】:

    标签: sql stored-procedures escaping user-defined-functions snowflake-cloud-data-platform


    【解决方案1】:

    好的,我找到了解决方案。

    c.table_name 必须从 GROUP BY 中排除并替换为 tbl in

    CREATE OR REPLACE FUNCTION GET_SQL_TBL_MINUS_COL(tbl varchar, col varchar)
    RETURNS VARCHAR(16777216)
    AS
    
    $$
    SELECT 'SELECT ' || array_to_string(ARRAY_AGG(c.column_name),',') || ' FROM ' || tbl
    FROM INFORMATION_SCHEMA.COLUMNS c
    WHERE c.table_name = tbl  --table
    AND   c.column_name NOT LIKE (col) --column
    $$
    

    【讨论】:

      【解决方案2】:

      它不喜欢 GROUP BY。它表示 UDF 产生的不是标量值,这是不允许的。这样编译:

      CREATE OR REPLACE FUNCTION GET_SQL_TBL_MINUS_COL(tbl varchar, col varchar)
      RETURNS VARCHAR(255)
      AS
      
      $$
      SELECT 'SELECT ' || array_to_string(ARRAY_AGG(c.column_name),',') || ' FROM ' || c.table_name as STMT
      FROM INFORMATION_SCHEMA.COLUMNS c
      WHERE c.table_name = tbl  --table name
      AND   c.column_name NOT IN(col) --column name
      --GROUP BY c.table_name;
      $$;
      

      虽然它可以编译,但我不确定它是否是您想要的。如果这不能让您到达那里,请告诉我,我可以帮助修改 UDF。

      【讨论】:

      • SELECT GET_SQL_TBL_MINUS_COL('TABLE', 'COLUMN') 导致错误:SQL compilation error: [C.TABLE_NAME] is not a valid group by expression
      • 确实如此。我会检查一下。
      • 我找到了解决方案 ;)
      • 如果您有时间请发帖。谢谢。
      • 完成了,看看:)
      猜你喜欢
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 2017-03-06
      • 2012-12-15
      相关资源
      最近更新 更多