Snowflake cloud data platform 如果存在xxx(找到的对象类型为TABLE),是否可以忽略下拉视图上的错误?

Snowflake cloud data platform 如果存在xxx(找到的对象类型为TABLE),是否可以忽略下拉视图上的错误?,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,如果你有 DROP VIEW IF EXISTS mydatabase.myschema.myname; CREATE OR REPLACE TABLE mydatabase.myschema.myname AS ... 失败,错误代码为2203SQL编译错误:找到的对象类型为“TABLE”,而不是指定的“VIEW”类型。 我的意图是创建一个脚本,将一组现有视图“转换”为表(通过任务定期更新)。我希望脚本是可重复的,所以我想我可以DROP VIEW IF EXISTS xxx删除视图IF

如果你有

DROP VIEW IF EXISTS mydatabase.myschema.myname;

CREATE OR REPLACE TABLE  mydatabase.myschema.myname AS ...
失败,错误代码为2203
SQL编译错误:找到的对象类型为“TABLE”,而不是指定的“VIEW”类型。

我的意图是创建一个脚本,将一组现有视图“转换”为表(通过任务定期更新)。我希望脚本是可重复的,所以我想我可以
DROP VIEW IF EXISTS xxx
删除视图IF EXISTS xxx,但如果已经有一个同名的表,这似乎会失败。所以,当脚本第一次运行ok时,它会删除视图并创建表,但如果我再次运行脚本,它将失败,因为现在有同名的表


那么,如果存在xxx,是否有办法忽略
下拉视图中的错误,或者如果存在具有该名称的视图,是否只运行该命令

我的建议是创建一个存储过程,在所有视图中循环并从中创建表。在该存储过程中,您可以检查对象是否已作为表存在,并跳过该对象。

您有许多选项

您可以从信息模式中读取脚本,以获取视图列表并删除。此SQL获取除信息模式之外的所有视图的列表

select * from INFORMATION_SCHEMA.VIEWS where TABLE_SCHEMA <> 'INFORMATION_SCHEMA';
如果您想循环遍历整个帐户中的每个数据库和模式,我编写了一个存储过程来实现这一点。它设计用于对所有视图进行依赖性检查,但也可以修改以删除它们


如何跳过对象?您是否会修改Greg的存储过程,在catch(err)子句中添加skip file,并传入一个视图列表?我只会查询information_schema.tables以查找视图不作为表存在的记录,然后只执行该列表的语句。好主意,也许您可以与我们共享结果:)
create or replace procedure DropView(viewName string)
returns string
language JavaScript
execute as OWNER
as
  $$  
    var sql_command = 
    'drop view ' + VIEWNAME;
    try {
            var stmt = snowflake.createStatement( {sqlText: sql_command} );
            var resultSet = stmt.execute();        
            while (resultSet.next())  {
                outString = resultSet.getColumnValue('status');
            }
        }
    catch (err)  {
        outString = err;   // Return a success/error indicator.
        }
   return outString;
  $$;