【问题标题】:How can i traverse all the tables with specific name and then update a particular column value from each table如何遍历具有特定名称的所有表,然后从每个表中更新特定列值
【发布时间】:2021-12-24 20:32:57
【问题描述】:

如何遍历所有具有特定名称的表(比如说'%SP%'),然后在雪花过程中更新每个表中的特定列值? 我还必须显示每个表更新了多少行 Like- table1 - xyz 行已更新

【问题讨论】:

    标签: sql stored-procedures snowflake-cloud-data-platform


    【解决方案1】:

    除非您要重复执行此操作,否则存储过程比仅使用 SQL 生成器需要更多的工作。您可以使用 show 命令作为 Marcel 注释,也可以使用 SNOWFLAKE 数据库获取所有匹配列的列表。我在此示例中使用了 SNOWFLAKE 数据库,它假定在过去几分钟内没有人创建新的匹配列(需要一些时间来反映 SNOWFLAKE 数据库中的新更改)。

    这个查询展示了如何找到匹配的列:

    -- Find columns in any database matching the pattern '%SP%'. Note: The SNOWFLAKE database has information that may be up to 3 hours later than the changes.
    select C.TABLE_CATALOG, C.TABLE_SCHEMA, C.TABLE_NAME, C.COLUMN_NAME 
    from "SNOWFLAKE"."ACCOUNT_USAGE"."COLUMNS" C
        left join "SNOWFLAKE"."ACCOUNT_USAGE"."TABLES" T on C.TABLE_ID = T.TABLE_ID
    where T.TABLE_TYPE = 'BASE TABLE' and C.TABLE_CATALOG not in ('SNOWFLAKE') and C.TABLE_SCHEMA not in ('INFORMATION_SCHEMA') and C.DATA_TYPE = 'TEXT' and  C.COLUMN_NAME like '%SP%';
    

    此查询显示将生成 UPDATE 语句的 SQL 生成器。

    select listagg(concat('update "', C.TABLE_CATALOG, '"."', C.TABLE_SCHEMA, '"."', C.TABLE_NAME, '" set "', COLUMN_NAME, '"=''NEW_VALUE'' where ', COLUMN_NAME, '=''OLD_VALUE'''), ';\n') || ';'
    from "SNOWFLAKE"."ACCOUNT_USAGE"."COLUMNS" C
        left join "SNOWFLAKE"."ACCOUNT_USAGE"."TABLES" T on C.TABLE_ID = T.TABLE_ID
    where T.TABLE_TYPE = 'BASE TABLE' and C.TABLE_CATALOG not in ('SNOWFLAKE') and C.TABLE_SCHEMA not in ('INFORMATION_SCHEMA') and C.DATA_TYPE = 'TEXT' and  C.COLUMN_NAME like '%SP%'; 
    

    就捕获更新的行数而言,这将在查询历史记录中。如果这是一劳永逸的事情,那么这样做会更容易。

    【讨论】:

    • 感谢您的帮助.. 我想了解如何保存查询的结果,因为有 ~354 个更新语句,所以我如何保存所有这些.. 这不是一次这将重复发生
    • 在这种情况下,您将需要编写一个存储过程,或者如果您更喜欢 Snowflake 超大的东西,例如 Python 脚本、Java、C#、Node.js 等来构建语句,运行它们,并捕获受影响的行数。
    【解决方案2】:

    你可以使用

    1. 显示类似“%SP%”的表:https://docs.snowflake.com/en/sql-reference/sql/show-tables.html
    2. 信息架构或帐户使用表-视图:https://docs.snowflake.com/en/sql-reference/info-schema/tables.html

    但请注意:根据您的权限和上下文,结果可能会有所不同。 SHOW 有一个附加参数“in account”,INFORMATION_SCHEMA 是每个数据库单独的。 ACCOUNT_USAGE.TABLES 跨所有数据库。

    【讨论】:

      猜你喜欢
      • 2014-11-04
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多