首页 > 解决方案 > 通过 UDF 表插入表不能从存储过程中工作

问题描述

我的存储过程应该通过 UDF 将数据插入表中。

当我将它作为 SQL 语句运行时,我生成的字符串是正确的,但是当我通过存储过程执行它时,它会引发语法错误。

这是 SQL 语句:

insert into dbname.public.TBLPROVIDER 
    select * 
    from table(f_TBLPROVIDER('dbname',cast('20211031233226' as bigint)));

这是存储过程失败的代码

var sql_tbl_populate  = "insert into " + S_DB_NAME + ".public." + TBL_NAME + " "
sql_tbl_populate += "select * from table(f_" + TBL_NAME +"('"+ S_DB_NAME + "',cast('" + S_TIMESTAMP + "' as bigint)));"
stmt_sql_tbl_populate = snowflake.createStatement({sqlText: sql_tbl_populate} );
stmt_sql_tbl_populate.execute();

错误是

存储过程 SP_POPULATE_TRGT_TABLES 中的执行错误:SQL 编译错误:位置 105 的语法错误第 1 行意外“dbname”。
在 Statement.execute 第 21 行位置 23

标签: sqlstored-proceduressnowflake-cloud-data-platform

解决方案


我能够找到您的查询并找出您的 SP 的 DDL。

当您尝试插入 tbl_log 表时,问题在于以下查询:

var sqld = "insert into log_table values ('" + sql_tbl_populate + "')";

实际失败的查询是:

insert into log_table values ('insert into dbname.public.tablename select * from table(f_TBLPROVIDER('dbname',cast('20211031233226' as bigint)));')

因为您在变量“sql_tbl_populate”周围有单引号,该变量已经在函数 f_TBLPROVIDER 中包含了参数的单引号。

在变量“sqld”中构建 INSERT 语句时,需要转义“sql_tbl_populate”中的单引号。


推荐阅读