处理因错误 Snowflake 而中止

Processing aborted due to error Snowflake

我遇到了这个错误:

Execution error in stored procedure: SQL execution internal error: Processing aborted due to error at Snowflake.execute

当 运行 这个脚本时:

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);
            
            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
                                FROM
                                    TABLE (generator (rowcount => :3))) DatesDiff (n)
                            ); `,
                            
                    binds: [formatDate(INITIALDATE), formatDate(FINALDATE), DATESDIFF]

                    }
            
            ); 
    
    
        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('-');
        }

$$
;

CALL DATES_TABLE('2021-04-01','2021-05-24');

当 运行 在存储过程之外时,创建一个 table,日期介于输入的 运行ge 之间。

知道为什么会这样吗?如何解决?

问题在于将变量绑定到 TABLE (generator (rowcount => :3)),因为 Snowflake 期望那里有一个常量。

相反,您可以这样做:

 SELECT ROW_NUMBER() OVER (ORDER BY 1) - 1 AS rn
 FROM TABLE (generator (rowcount => 1000))
 QUALIFY rn < :2

我做了一些清理工作,效果很好:

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);
            snowflake.execute(          
            {
                sqlText: `
                CREATE OR REPLACE TEMPORARY TABLE TEMP_DATE_RANGE AS
                SELECT CAST(DATEADD(DAY, DatesDiff.rn, :1) AS DATE) AS DATE
                FROM (
                    SELECT ROW_NUMBER() OVER (ORDER BY 1) - 1 AS rn
                    FROM TABLE (generator (rowcount => 1000))
                    QUALIFY rn < :2
                ) 
                ;`
                , binds: [formatDate(INITIALDATE), DATESDIFF]
            }
            
            ); 
    
    
        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('-');
        }

$$
;

CALL DATES_TABLE('2021-04-01','2021-05-24');
select * from TEMP_DATE_RANGE;

有关生成日期序列的更短方法,请参阅我对 的回答。