如何在Snowflake存储过程中传递SELECT/CREATE查询作为参数
解决Snowflake存储过程中传递DDL/DML语句参数的执行问题
你遇到的问题是在Snowflake存储过程里传入完整的SQL语句(比如CREATE TABLE这类)作为参数,执行时触发标识符无效和绑定错误。
原问题代码
CREATE OR REPLACE PROCEDURE TEST_PROC(query varchar) returns varchar LANGUAGE SQL as $$ begin if(length(query)>=1 and IS_NOTNULL(query) )then execute immediate (:query); --execute immediate IDENTIFIER(:query); end if; end; $$; call TEST_PROC('CREATE OR REPLACE TABLE TBL1 AS SELECT * FROM TBL2')
问题原因
INDENTIFIER(:param)的作用是解析对象标识符(比如表名、列名),不能用来处理完整的SQL语句,用它会把整个语句当成一个对象名,自然会报标识符无效。execute immediate (:query)里的:query是绑定变量语法,Snowflake的绑定变量只能用来替换SQL中的值(比如WHERE id = :val),不能替换完整的SQL语句块,所以会触发绑定错误。
正确解决方案
直接将参数字符串传入execute immediate,不需要加冒号或INDENTIFIER(),因为execute immediate本身就支持直接传入字符串形式的SQL语句。
修正后的代码
CREATE OR REPLACE PROCEDURE TEST_PROC(query varchar) returns varchar LANGUAGE SQL as $$ begin if(length(query)>=1 and IS_NOTNULL(query) )then execute immediate query; -- 直接使用参数名即可 end if; end; $$; call TEST_PROC('CREATE OR REPLACE TABLE TBL1 AS SELECT * FROM TBL2')
这样调用存储过程时,传入的完整SQL语句就能被正确执行了。
内容的提问来源于stack exchange,提问作者user13975334
相关产品推荐
相关产品推荐

