【问题标题】:SQL Server loop select through tables selected in sysobjectsSQL Server 循环选择在 sysobjects 中选择的表
【发布时间】:2021-09-22 20:19:58
【问题描述】:

我可以通过 sysobjects 中的名称选择数据库中的搜索表。

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

谁能建议如何在 SQL Server 2012 (v11) 中实现它?

提前致谢!

【问题讨论】:

  • 这能回答你的问题吗? SQL Server Dynamic SQL - Get output from list of tables 虽然首先需要这样做是糟糕设计的标志
  • 感谢您的评论和对最接近主题的引用。但是,它对我不起作用,因为不会通过 UNION 结果的表进行迭代循环。但是,它仅适用于列表中的一个表。仍在通过子查询表寻找迭代器。
  • does not make iteration-loop through the tables for UNION results 这正是这些答案的作用。如果您想要其他内容,则需要更好地解释。演示一下从sys.objects构造动态查询后会是什么样子
  • 我可以得到如下表的列表:SELECT OBJECT_NAME(i.id) FROM sysindexes i INNER JOIN sysobjects o ON i.id=o.id WHERE OBJECT_NAME(i.id) like ' %_snap_%' AND indidsnap 表都具有公共字段 Date,我需要从所有选定表的该字段中获取唯一值。
  • 为什么还要查询sysindexes

标签: sql-server loops object variables subquery


【解决方案1】:

您需要为此使用动态 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 Server 版本是 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);

【讨论】:

  • 它说我 STRING_AGG 不是一个已定义的函数,可以将其替换为其他类似 Concat 的函数吗?
  • 您使用的是 SQL Server 2016 或更早版本吗?给你另一个解决方案
猜你喜欢
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 2015-07-03
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多