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

Snowflake存储过程计数异常:应返回1却返回0

问题分析与解决方案

核心问题1:存储过程调用语法错误

sp_test_1中调用sp_test_2并赋值的写法不符合Snowflake SQL存储过程的语法规范,获取另一个存储过程的返回值必须使用CALL ... INTO ...语法,而非直接赋值。

核心问题2:冗余游标处理(优化点)

sp_test_2中用游标处理单行统计结果完全冗余,直接通过SELECT ... INTO即可完成赋值,能减少代码复杂度并避免潜在的游标逻辑问题。

修正后的存储过程代码

修正sp_test_1

CREATE OR REPLACE PROCEDURE db.schema.sp_test_1()
RETURNS VARCHAR
LANGUAGE SQL 
AS
$$
DECLARE
    db_name varchar(20) DEFAULT 'DB1';
    schema_name varchar(30) DEFAULT 'SCHEMA1';
    table_name varchar(50);
    col_name varchar(60);
    response integer;
BEGIN
  table_name := 'TABLE1';
  col_name := 'COL1';
  -- 修正调用语法,用INTO捕获返回值
  CALL sp_test_2(:db_name,:schema_name,:table_name,:col_name) INTO :response;
  RETURN response;
END;
$$;

修正sp_test_2

CREATE OR REPLACE PROCEDURE db.schema.sp_test_2(db_na VARCHAR, schema_na VARCHAR, table_na VARCHAR, col_na VARCHAR)
RETURNS INTEGER
LANGUAGE SQL
AS
$$
DECLARE
    value INTEGER;
BEGIN
    -- 直接用INTO赋值,无需游标
    SELECT COUNT(*) 
    INTO :value 
    FROM "INFORMATION_SCHEMA"."COLUMNS" 
    WHERE "TABLE_CATALOG" = :db_na 
      AND "TABLE_SCHEMA" = :schema_na 
      AND "TABLE_NAME" = :table_na 
      AND "COLUMN_NAME" = :col_na;
    RETURN value;
END;
$$;

额外验证点

如果修正后仍返回0,需检查:

  • 传入的db_name、schema_name、table_name、col_name与INFORMATION_SCHEMA.COLUMNS中的值大小写完全匹配(若对象是通过双引号创建的,Snowflake会保留大小写,此时必须严格匹配)。
  • 执行存储过程的角色是否拥有INFORMATION_SCHEMA.COLUMNS的查询权限。

内容的提问来源于stack exchange,提问作者Robertino Bonora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:42:15