如何在Snowflake存储过程SELECT语句中用变量指定库和模式名(非动态SQL)
在Snowflake存储过程中用变量指定库和模式名的解决方案
你的代码无法运行的核心原因是:Snowflake的静态SQL不支持通过变量拼接来引用数据库对象(库、模式、表这类标识符)。静态SQL在编译阶段就需要明确所有对象的完整名称,而变量的值只有在存储过程运行时才会确定,所以直接用:schema_name||'.EMPLOYEE'的写法根本无法被解析。
虽然你不想用动态SQL,但在Snowflake里要动态指定对象名,这是唯一可行的方式,以下是修正后的代码:
DECLARE V_RET VARCHAR(1000) := ''; schema_name VARCHAR(100) := 'EDWSTGP.DBU_CDS'; -- 补充变量的数据类型 BEGIN -- 用EXECUTE IMMEDIATE执行动态拼接的SQL,将结果存入变量 EXECUTE IMMEDIATE 'SELECT FIRST_NAME FROM ' || :schema_name || '.EMPLOYEE LIMIT 1' INTO V_RET; RETURN V_RET; END;
如果你的对象名包含特殊字符或者是大小写敏感的,需要用IDENTIFIER()函数来包裹,避免解析错误:
DECLARE V_RET VARCHAR(1000) := ''; schema_name VARCHAR(100) := 'EDWSTGP.DBU_CDS'; BEGIN EXECUTE IMMEDIATE 'SELECT FIRST_NAME FROM IDENTIFIER(''' || :schema_name || '.EMPLOYEE' || ''') LIMIT 1' INTO V_RET; RETURN V_RET; END;
内容的提问来源于stack exchange,提问作者siddhartha jain
相关产品推荐
相关产品推荐

