在Snowflake中运行动态SQL时,我遇到了以下错误:

未完成对‘SQL_Main’的赋值,因为值超出了变量的大小限制.其大小为263;限制为256(以字节为单位的内部存储大小).

以下是代码:

SET v_G = '1';
SET v_G1 = $v_G::VARCHAR;
SET v_P = (SELECT "txtstr" FROM table2 WHERE "grouping" = $v_G);
SET SQL_MAIN = 'CREATE TABLE N_1 AS
                SELECT a1.YEARMONTH as "DATE",
                COUNT(a1.RECORD_NUM) AS "COUNT",
                ' || $v_G1 ||' AS "GROUP"
                FROM table1 a1
                WHERE ' || $v_P || ' GROUP BY YEARMONTH';

EXECUTE IMMEDIATE $SQL_MAIN;

set d_max_row = (select count(*) from table2");

begin
    let counter :=1;
        while (counter <= $d_max_row)
        do
            SET v_G = $v_G+1;
            SET v_G1 = $v_G::VARCHAR;
            SET v_P = (SELECT "txtstr" FROM table2 WHERE "grouping" = $v_G);
            SET SQL_MAIN = 'INSERT INTO N_1 (DATE, COUNT, GROUP)
                            SELECT a1.YEARMONTH as "DATE",
                            COUNT(a1.RECORD_NUM) AS "COUNT",
                            ' || $v_G1 ||' AS "GROUP"
                            FROM table1 a1
                            WHERE ' || $v_P || ' GROUP BY YEARMONTH';

            EXECUTE IMMEDIATE $SQL_MAIN;
           
            counter := counter + 1;
        end while;
    return counter;
end;

作为表1中的条件,有没有办法遍历表2中"txtstr"列中的每条记录,并在单独的表中返回结果?

我找到了很多针对Java脚本的示例,但没有针对SQL的太具体的示例.请让我知道这是否可能在snowflake.

谢谢!

推荐答案

看看 comments --让我来构建一个完整的卢卡斯和尼克W所说的例子.

让我用下面的set开始重现这个错误:

set long_string = (select array_generate_range(1,100)::string);

-- Assignment to 'LONG_STRING' not done because value exceeds size limit for variables. Its size is 289; the limit is 256 (internal storage size in bytes).

由于您的目标是构造要执行的长SQL字符串,因此这是一个构造并执行长SQL字符串的最小示例:

declare 
    long_string default (select array_generate_range(1,100)::string);
    sql_to_execute string;
    rs resultset;
begin
    sql_to_execute := $$ select $$ || long_string;
    rs := (execute immediate sql_to_execute);
    return table(rs);
end;
-- [   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,   11,   12,   13,   14,   15,   16,   17,   18,   19,   20,   21,   22,   23,   24,   25,   26,   27,   28,   29,   30,   31,   32,   33,   34,   35,   36,   37,   38,   39,   40,   41,   42,   43,   44,   45,   46,   47,   48,   49,   50,   51,   52,   53,   54,   55,   56,   57,   58,   59,   60,   61,   62,   63,   64,   65,   66,   67,   68,   69,   70,   71,   72,   73,   74,   75,   76,   77,   78,   79,   80,   81,   82,   83,   84,   85,   86,   87,   88,   89,   90,   91,   92,   93,   94,   95,   96,   97,   98,   99 ]

秘诀是避免使用set,而是在declare块中声明变量.

Sql相关问答推荐

SQL查询以创建手头的流动余额?

SQL计数所有值在联接范围内的行

在SQL:2003(PGQ)中,Cypher查询语言、GQL、PGQL和属性图查询的常见子集是什么?'

Stack Exchange站点上的最短帖子(按正文长度计算,用户名为原始发帖(SEDE))

有没有办法用SQL编写一条CASE语句,如果列A&>0,那么列B,列C=0

Lag()函数的差异:R与SQL(将R代码转换为SQL)

如何利用单列历史SQLsnowflake获得合并结果

对表进行多项 Select 以返回最大值和时间

关于Postgres横向联接的谓词

在xml.Modify方法中使用子字符串和可能的替代方法

Select 列组(按同一表格中的另一列分组)Laravel 10

PostgreSQL:查找继承表中的特定记录属于哪个表

Postgres SQL查询从字符串中获取邮箱地址

使用特定的Order By子句随机化SQL输出

使用临时表判断记录是否存在 - 如果存在则执行相同的操作

Oracle 21c 中的递归查询回顾过go 3 周

删除每个不同日期中未 Select 的最短最长时间

Clob 问题 - 将 clob 列拆分为多行

PostgreSQL - 递归地聚合来自不同列的属性

SQL 函数 DIFFERENCE 返回有趣的分数