snowflake-cloud-data-platform - 大写 SQL 语句在 Snowflake 存储过程中不起作用
问题描述
在下面的示例中,working_one
存储过程有效,而存储过程broken_one
无效。两者的唯一区别是 SQL 语句的字母大小写。
create table tmp (
raw_json variant
);
-- 2019-01-01 = 1546347600000
-- 2018-01-01 = 1514811600000
insert into tmp select parse_json('{ "timestamp":1514811600000}');
create or replace procedure working_one(TIME_VALUE varchar)
returns varchar
language javascript
as
$$
var stmtString = "delete from tmp where to_timestamp(raw_json:timestamp::string) < to_timestamp(:1);"
var stmt = snowflake.createStatement({sqlText: stmtString, binds: [TIME_VALUE]})
var rs = stmt.execute()
rs.next()
return rs.getColumnValue(1)
$$;
create or replace procedure broken_one(TIME_VALUE varchar)
returns varchar
language javascript
as
$$
var stmtString = "DELETE FROM TMP WHERE TO_TIMESTAMP(RAW_JSON:TIMESTAMP::STRING) < TO_TIMESTAMP(:1);"
var stmt = snowflake.createStatement({sqlText: stmtString, binds: [TIME_VALUE]})
var rs = stmt.execute()
rs.next()
return rs.getColumnValue(1)
$$;
call broken_one('1546347600000');
call working_one('1546347600000');
解决方案
我不认为问题出在 SQL 的大小写敏感性上,甚至不在于它是存储过程。问题是 JSON 中的属性区分大小写。试试这个,告诉我这是否更适合你。
create or replace procedure fixed_one(TIME_VALUE varchar)
returns varchar
language javascript
as
$$
var stmtString = "DELETE FROM TMP WHERE TO_TIMESTAMP(RAW_JSON:timestamp::STRING) < TO_TIMESTAMP(:1);"
var stmt = snowflake.createStatement({sqlText: stmtString, binds: [TIME_VALUE]})
var rs = stmt.execute()
rs.next()
return rs.getColumnValue(1)
$$;
推荐阅读
- mongodb - MongoDB:文档大小对集合扫描性能和“工作集”内存占用有什么影响?
- flutter - 未处理的异常:将对象转换为可编码对象失败:摄影
- html - div中水平的文本图像
- django - 如何加入模型并通过加入从第二个模型中获取名称
- javascript - NodeJS中mongo的limit和skip方法的约定
- python - 我不确定如何将这个 for 循环与多处理模块并行化
- r - 将月-年格式的日期转换为月的最后一个日期
- python - 如何删除 xml 或 html 命令行并使用 python 检索实际文本数据?
- c++ - 是否可以在具有基类定义的映射中传递子类对象?
- python - 如何从连续行中查找损益百分比