Snowflake存储过程执行报Processing aborted due to error问题求助
问题原因
- 核心报错原因:Snowflake的
generator函数的rowcount参数仅接受正整数类型入参,你通过JavaScript除法计算得到的DATESDIFF是浮点类型(即使数值为整数也会被识别为53.0这类浮点数),类型不匹配触发SQL内部执行错误。 - 逻辑缺陷:日期区间计算未加1,会漏掉结束日期。比如输入的2021-04-01到2021-05-24共54天,当前逻辑计算得到的差值为53,仅会生成53条日期数据,缺少最后一天的记录。
- 语法遗漏:存储过程定义了
RETURNS VARCHAR,但代码中没有return返回语句,执行完成后会触发返回值缺失错误。
解决方案
修改后的完整代码如下:
CREATE OR REPLACE PROCEDURE DATES_TABLE (INITIALDATE VARCHAR, FINALDATE VARCHAR) RETURNS VARCHAR LANGUAGE JAVASCRIPT EXECUTE AS CALLER AS $$ var DATESDIFF = (Date.parse(formatDate(FINALDATE)) - Date.parse(formatDate(INITIALDATE)))/ (1000 * 3600 * 24); // 转整数并加1,保证包含首尾日期 var ROW_COUNT = parseInt(DATESDIFF) + 1; snowflake.execute( { sqlText: `CREATE OR REPLACE TEMPORARY TABLE TEMP_DATE_RANGE AS SELECT DATE FROM ( SELECT CAST(DATEADD (DAY, DatesDiff.n, :1) AS DATE) AS DATE FROM ( SELECT ROW_NUMBER() OVER (ORDER BY 1) - 1 AS n FROM TABLE (generator (rowcount => :2))) DatesDiff (n) ); `, binds: [formatDate(INITIALDATE), ROW_COUNT] }); function formatDate(date) { var d = new Date(date), month = '' + (d.getMonth() + 1), day = '' + d.getDate(), year = d.getFullYear(); if (month.length < 2) month = '0' + month; if (day.length < 2) day = '0' + day; return [year, month, day].join('-'); } // 添加返回语句 return '日期表生成成功,共' + ROW_COUNT + '条数据'; $$ ; CALL DATES_TABLE('2021-04-01','2021-05-24');
修改点说明:
- 新增
ROW_COUNT变量,将日期差值转换为整数后加1,同时适配generator的参数类型要求,也解决了结束日期缺失的问题 - 清理了SQL绑定变量中无用的参数,调整了绑定变量的序号对应关系
- 修复了HTML转义字符问题,把
=>、<改回正常的=>、< - 新增返回语句,符合存储过程的返回值要求
内容的提问来源于stack exchange,提问作者Carlos Escobar
相关产品推荐
相关产品推荐

