簡體   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