作为字符串列,我构建了我想要 运行 的查询。我该如何执行它?

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 列包含了我想要 运行 的查询。但是,我不知道如何 运行 它。原则上,我可以使用游标,但它们通常是个糟糕的主意。是否有其他方法可以“执行”此专栏?

实现此目的的一种方法是构建一个字符串以结合 concatstring_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);