我在架構中的所有表都DIM共享一個名為USER_CHECKED. 對于代理作業,我想輸出(我不特別關心在哪里/做什么)模式中每個表的名稱以及USER_CHECKED具有值的次數0。在撰寫此代理作業之前,我需要撰寫底層查詢。自然的解決方案是使用sp_MSforeachtable,但這是不受支持的。相反,我做了這樣的事情
USE [MY-DB]
SELECT
TABLE_CATALOGUE,
CONCAT('SELECT COUNT(CASE WHEN [USER_CHECKED] = 0 THEN 1 END) FROM MY-DB.DIM.', 'TABLE_CATALOGUE') AS TO_RUN
FROM
information_schema.tables
WHERE
TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA = 'DIM'
因此,該TO_RUN列包含我想要運行的查詢。但是,我不知道如何運行它。原則上,我可以使用游標,但它們通常是一個糟糕的主意。有沒有另一種方法來“執行”這個專欄?
uj5u.com熱心網友回復:
實作此目的的一種方法是構建單個字串以組合執行,concat并string_agg構建單個查詢來聯合您對每個表的個人選擇。
然后,您可以選擇包含一個insert into以將結果插入某處。
最好使用系統表而不是資訊模式視圖。
您可能想要調整的基本思想如下 - 顯然未經您的環境測驗:
declare @Sql nvarchar(max);
select @Sql = String_Agg(Convert(varchar(max),
Concat(
'select '
, QuoteName(t.[name], '''')
, ' as SourceTable, count(case when USER_CHECKED = 0 then 1 end) User_CheckedIsZero from '
, QuoteName(t.[name])
)), ' union all ' char(13)) -- Includes return so print output is readable
from sys.tables t
where Schema_Name(t.schema_id) = 'DIM' and t.[type] = 'U' and t.is_ms_shipped = 0
and exists (select * from sys.columns c where c.object_id = t.object_id and c.[name]='USER_CHECKED');
print @Sql;
-- exec(@Sql);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/483410.html
