【发布时间】:2021-12-24 20:32:57
【问题描述】:
如何遍历所有具有特定名称的表(比如说'%SP%'),然后在雪花过程中更新每个表中的特定列值? 我还必须显示每个表更新了多少行 Like- table1 - xyz 行已更新
【问题讨论】:
标签: sql stored-procedures snowflake-cloud-data-platform
如何遍历所有具有特定名称的表(比如说'%SP%'),然后在雪花过程中更新每个表中的特定列值? 我还必须显示每个表更新了多少行 Like- table1 - xyz 行已更新
【问题讨论】:
标签: sql stored-procedures snowflake-cloud-data-platform
除非您要重复执行此操作,否则存储过程比仅使用 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%';
就捕获更新的行数而言,这将在查询历史记录中。如果这是一劳永逸的事情,那么这样做会更容易。
【讨论】:
你可以使用
但请注意:根据您的权限和上下文,结果可能会有所不同。 SHOW 有一个附加参数“in account”,INFORMATION_SCHEMA 是每个数据库单独的。 ACCOUNT_USAGE.TABLES 跨所有数据库。
【讨论】: