作为字符串列,我构建了我想要 运行 的查询。我该如何执行它?
As a string column, I've constructed the query that I want to run. How can I execute it?
我在 DIM
模式中的所有 table 共享一个名为 USER_CHECKED
的位列。对于代理作业,我想输出(我并不特别关心 where/what 到)架构中每个 table 的名称以及 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
列包含了我想要 运行 的查询。但是,我不知道如何 运行 它。原则上,我可以使用游标,但它们通常是个糟糕的主意。是否有其他方法可以“执行”此专栏?
实现此目的的一种方法是构建一个字符串以结合 concat
和 string_agg
来执行,以构建一个查询,该查询联合您为每个 table.
然后您可以选择包含 insert into
以将结果插入某处。
最好使用系统 tables 而不是信息架构视图。
您可能想要调整的基本想法如下 - 显然未针对您的环境进行测试:
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);
我在 DIM
模式中的所有 table 共享一个名为 USER_CHECKED
的位列。对于代理作业,我想输出(我并不特别关心 where/what 到)架构中每个 table 的名称以及 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
列包含了我想要 运行 的查询。但是,我不知道如何 运行 它。原则上,我可以使用游标,但它们通常是个糟糕的主意。是否有其他方法可以“执行”此专栏?
实现此目的的一种方法是构建一个字符串以结合 concat
和 string_agg
来执行,以构建一个查询,该查询联合您为每个 table.
然后您可以选择包含 insert into
以将结果插入某处。
最好使用系统 tables 而不是信息架构视图。
您可能想要调整的基本想法如下 - 显然未针对您的环境进行测试:
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);