sql - 通过 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
解决方案
我能够找到您的查询并找出您的 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”中的单引号。
推荐阅读
- windows - 使用 Windows 终端的 Cygwin 起始目录
- list - 如何将地图数据转换为颤动中的对象列表?
- typescript - 如何获得DefinitelyTyped @types 包版本之间的变化差异?
- flutter - 创建一个包含一列条子的条子
- swift - 如果authorizationStatus 被拒绝,SwiftUI 会将用户引导到他们的设置页面
- c# - API 不起作用,使用 Docker 和 ASP.NET CORE
- python - 在 django send_mass_mail 发送的邮件中创建粗体文本
- python - discord.py:如何在一定数量的数字后设置逗号?
- node.js - GitLabCI 部署 expressjs 应用程序未完成部署阶段
- c# - 可为空的引用类型:“Try”方法模式,返回 false 时收到 null 警告