如何使用SnowSQL CLI调用Snowflake存储过程并传递参数部署制品
SnowSQL CLI 调用带参数Snowflake存储过程实操方案
基础调用规则
SnowSQL中调用存储过程使用CALL命令,参数传递支持位置传参和命名传参两种方式,示例基于如下存储过程定义:
CREATE OR REPLACE PROCEDURE deploy_artifact(artifact_path STRING, target_env STRING, version STRING)
RETURNS STRING
LANGUAGE SQL
AS
$$
-- 部署逻辑省略
$$
- 位置传参(按定义顺序传递参数):
CALL deploy_artifact('/repo/artifacts/v1.2.3.zip', 'prod', '1.2.3'); - 命名传参(指定参数名传递,顺序可调整,适合参数多的场景):
CALL deploy_artifact(artifact_path => '/repo/artifacts/v1.2.3.zip', version => '1.2.3', target_env => 'prod');
不同场景的实现方案
1. 临时测试场景(交互模式)
直接进入SnowSQL交互终端,切换到对应的数据库、Schema、仓库后,执行上述CALL命令即可。
如果参数包含单引号等特殊字符,用两个单引号做转义处理,示例:CALL deploy_artifact('/repo/artifact''s_v1.2.3.zip', 'prod', '1.2.3');
2. 自动化部署场景(脚本模式)
适合CI/CD流水线执行部署,通过SnowSQL变量功能传递动态参数,无需修改部署脚本:
- 编写部署脚本
deploy.sql:
-- 引用外部传入的变量完成存储过程调用 CALL deploy_artifact($ARTIFACT_PATH, $TARGET_ENV, $BUILD_VERSION);
- 执行SnowSQL命令,通过
-D参数传入变量值:snowsql -a <你的账户标识> -u <用户名> -d <部署数据库名> -s <对应Schema名> -w <执行仓库名> -r <部署角色名> -D ARTIFACT_PATH="/repo/artifacts/v1.2.3.zip" -D TARGET_ENV="prod" -D BUILD_VERSION="1.2.3" -f deploy.sql
注:
-D定义的变量名需全大写,脚本中通过$+变量名直接引用,无需额外加引号,SnowSQL会自动匹配参数类型。
3. 部署结果校验
如需判断存储过程执行结果用于流水线失败拦截,可在脚本中增加返回值判断逻辑:
-- 捕获存储过程返回值 SET deploy_result = (CALL deploy_artifact($ARTIFACT_PATH, $TARGET_ENV, $BUILD_VERSION)); -- 根据返回值输出退出码,SUCCESS返回0,其他返回1 SELECT IF($deploy_result = 'SUCCESS', 0, 1) AS exit_code;
执行SnowSQL时增加参数-o exit_on_error=true -o quiet=true,即可根据返回的退出码判断部署是否成功。
常见问题注意事项
- 执行调用的角色需提前授予存储过程的
USAGE权限,以及存储过程内部操作涉及的所有对象的对应权限 - 传递的参数类型必须与存储过程定义的参数类型完全匹配,数值类型参数不要额外加引号
- 执行前确认指定的虚拟仓库处于运行状态,避免仓库冷启动超时导致部署失败
内容的提问来源于stack exchange,提问作者user17389192
相关产品推荐
相关产品推荐

