SQL 服务器循环 select 通过在 sysobjects 中编辑的表 select

SQL Server loop select through tables selected in sysobjects

我可以 select 在 sysobjects 中使用其名称的模式搜索数据库中的表。

然后我必须对每个找到的表的数据应用相同的 select 并将输出作为合并的联合结果。

任何人都可以建议如何在 SQL Server 2012 (v11) 中实现吗?

提前致谢!

为此您需要使用动态 SQL。

  • 始终对对象名称使用 QUOTENAME
  • 不要使用旧的 sysobjects 表,它们已被弃用
  • PRINT @sql;检查生成的SQL
DECLARE @sql nvarchar(max) =
(SELECT
    STRING_AGG(CAST('
SELECT [Date] FROM ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name)
    AS nvarchar(max)), N'
UNION
'    )
  FROM sys.tables t
  WHERE t.name LIKE '%_snap_%'
);

PRINT @sql;

EXEC (@sql);

如果你的SQL服务器版本为2016或更早版本,则无法使用STRING_AGG,所以需要使用FOR XML方法

DECLARE @separator nvarchar(100) = N'
UNION
';

DECLARE @sql nvarchar(max) = STUFF(
(SELECT
    @separator + '
SELECT [Date] FROM ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name)
  FROM sys.tables t
  WHERE t.name LIKE '%_snap_%'
  FOR XML PATH(''), TYPE
).value('text()[1]','nvarchar(max)'),
1, LEN(@separator), '');

PRINT @sql;

EXEC (@sql);