繁体   English   中英

如何遍历具有特定名称的所有表,然后更新每个表中的特定列值

[英]How can i traverse all the tables with specific name and then update a particular column value from each table

如何遍历具有特定名称的所有表(假设为“%SP%”),然后在雪花过程中更新每个表的特定列值? 此外,我必须显示从每个表更新的行数 Like-table1 - xyz Rows updated

您可以使用

  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 跨所有数据库。

除非您要重复执行此操作,否则存储过程比仅使用 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%'; 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM