Snowflake多行输出存储过程:如何实现类似SQLPRINT的输出执行
如何执行Snowflake存储过程输出的多行SQL脚本?
我有一个Snowflake存储过程GET_TABLES,它会输出多行SQL脚本内容。想知道有没有类似SQLPRINT的方法,能直接执行这些输出的SQL语句?
存储过程代码如下:
create or replace procedure DIMENSIONS.DBMETA.GET_TABLES() returns TABLE (SQL_SCRIPT VARCHAR) LANGUAGE SQL AS $$ declare res RESULTSET DEFAULT ( SELECT CONCAT('INSERT INTO DIMENSIONS.DBMETA.TABLES(DATABASE_ID, DB_NAME, SCHEMA_ID, DATABASE_TABLE_ID, TABLE_NAME, TABLE_CREATE_DATE, OBJECT_TYPE, CREATE_BY_USER_ID) ','SELECT DB.DATABASE_ID,DB.SERVER_ID,DB.DATABASE_NAME,SCH.SCHEMA_ID,ISC.TABLE_NAME,ISC.CREATED,ISC.TABLE_TYPE,999 AS CREATE_BY_USER_ID FROM ',DB.DATABASE_NAME,'.','INFORMATION_SCHEMA.TABLES ISC ' , ' JOIN DIMENSIONS.DBMETA.DATABASES DB ON ISC.TABLE_CATALOG = DB.DATABASE_NAME AND DB.SERVER_ID = 320' ,'JOIN DIMENSIONS.DBMETA.SCHEMAS SCH ON ISC.TABLE_SCHEMA = SCH.SCHEMA_NAME AND DB.DATABASE_ID = SCH.DATABASE_ID' , ' LEFT JOIN DIMENSIONS.DBMETA.VW_TABLES SC ' ,'ON ISC.TABLE_CATALOG = SC.DATABASE_NAME AND ISC.TABLE_SCHEMA = SC.SCHEMA_NAME AND SC.SERVER_ID = DB.SERVER_ID AND SC.TABLE_NAME = ISC.TABLE_NAME' ,' WHERE SC.TABLE_NAME IS NULL') AS SQL_SCRIPT FROM DIMENSIONS.DBMETA.DATABASES DB WHERE DB.SERVER_ID = 320); BEGIN RETURN TABLE (res); END; $$
解决方案
方法1:通过存储过程自动循环执行
新建一个存储过程,调用GET_TABLES获取SQL脚本后逐行执行:
create or replace procedure DIMENSIONS.DBMETA.EXECUTE_GET_TABLES_SQL() returns VARCHAR LANGUAGE SQL AS $$ DECLARE cur CURSOR FOR SELECT SQL_SCRIPT FROM TABLE(DIMENSIONS.DBMETA.GET_TABLES()); sql_stmt VARCHAR; BEGIN FOR record IN cur DO sql_stmt := record.SQL_SCRIPT; EXECUTE IMMEDIATE sql_stmt; END FOR; RETURN '所有SQL脚本执行完成'; END; $$
执行调用:
CALL DIMENSIONS.DBMETA.EXECUTE_GET_TABLES_SQL();
方法2:手动复制执行(适合调试场景)
如果仅需临时执行,先查询获取所有SQL脚本:
SELECT SQL_SCRIPT FROM TABLE(DIMENSIONS.DBMETA.GET_TABLES());
将结果集中的每一行SQL脚本复制出来,单独运行即可。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

