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);
我可以 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);