You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在SQL块中执行SHOW WAREHOUSES无返回结果?

问题:Snowflake中BEGIN-END块内SHOW WAREHOUSES管道插入临时表无数据

尝试将SHOW WAREHOUSES的输出抓取到临时表中,在BEGIN-END块外单独执行带管道的语句时,仓库信息能正常写入表中,但将逻辑放在块内执行后,临时表无数据。最终希望将该逻辑用于存储过程,需解决此问题。

用户最初的代码:

CREATE OR REPLACE TEMPORARY TABLE APPSUPPORT.PROBLEMS2(PROBLEM_TEXT STRING NOT NULL);

BEGIN
    SHOW WAREHOUSES ->
        INSERT INTO APPSUPPORT.PROBLEMS2(PROBLEM_TEXT)
        SELECT "name"
            FROM $1
            ;
END;

SELECT PROBLEM_TEXT FROM APPSUPPORT.PROBLEMS2;

解决方案

Snowflake的管道操作符->在事务块(BEGIN-END)或存储过程中不被支持,需改用RESULT_SCAN函数捕获SHOW语句的结果集,具体实现如下:

修正后的BEGIN-END块代码

CREATE OR REPLACE TEMPORARY TABLE APPSUPPORT.PROBLEMS2(PROBLEM_TEXT STRING NOT NULL);

BEGIN
    -- 执行SHOW语句获取仓库列表
    SHOW WAREHOUSES;
    -- 通过RESULT_SCAN捕获上一条语句的结果,插入临时表
    INSERT INTO APPSUPPORT.PROBLEMS2(PROBLEM_TEXT)
    SELECT "name"
    FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
END;

SELECT PROBLEM_TEXT FROM APPSUPPORT.PROBLEMS2;

适配存储过程的实现

如果要将逻辑封装到存储过程中,代码示例如下:

CREATE OR REPLACE PROCEDURE APPSUPPORT.CAPTURE_WAREHOUSE_NAMES()
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
BEGIN
    -- 创建临时表(也可在存储过程外创建)
    CREATE OR REPLACE TEMPORARY TABLE APPSUPPORT.PROBLEMS2(PROBLEM_TEXT STRING NOT NULL);
    
    -- 执行SHOW语句
    SHOW WAREHOUSES;
    -- 插入捕获到的仓库名称
    INSERT INTO APPSUPPORT.PROBLEMS2(PROBLEM_TEXT)
    SELECT "name"
    FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
    
    RETURN '仓库名称已成功捕获到临时表';
END;
$$;

-- 调用存储过程
CALL APPSUPPORT.CAPTURE_WAREHOUSE_NAMES();
-- 查询结果
SELECT PROBLEM_TEXT FROM APPSUPPORT.PROBLEMS2;

说明

RESULT_SCAN函数是Snowflake中用于获取已执行语句结果集的标准方法,通过LAST_QUERY_ID()可以直接引用上一条执行的SHOW WAREHOUSES语句的结果,完美适配事务块和存储过程的执行环境,替代不支持的管道操作符。

内容的提问来源于stack exchange,提问作者Eric Mamet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:12:36