Sql 插入数据库名的循环

Sql 插入数据库名的循环,sql,sql-server,tsql,union,dynamic-sql,Sql,Sql Server,Tsql,Union,Dynamic Sql,我有许多数据库的表Table1具有相同的结构。所有表名都列在表testbase的main1数据库中。在循环中,有必要遍历表1中的所有行并将它们插入到查询中 SELECT * FROM [DBNAME].[DBO].Table1.Client UNION 要以这样的大查询结束,请执行以下操作: SELECT * FROM [DBNAME1].[DBO].Table1.Client UNION SELECT * FROM [DBNAME2].[DBO].Table1.Client UNION SE

我有许多数据库的表
Table1
具有相同的结构。所有表名都列在表
testbase
main1
数据库中。在循环中,有必要遍历表1中的所有行并将它们插入到查询中

SELECT * FROM [DBNAME].[DBO].Table1.Client
UNION
要以这样的大查询结束,请执行以下操作:

SELECT * FROM [DBNAME1].[DBO].Table1.Client
UNION
SELECT * FROM [DBNAME2].[DBO].Table1.Client
UNION
SELECT * FROM [DBNAME3].[DBO].Table1.Client
UNION
SELECT * FROM [DBNAME4].[DBO].Table1.Client
UNION
etc...

如何高效自动地执行此操作,这样我就不必每次添加客户端时都手动更改查询了?

如果所有表都相同,您可以使用
sp\u MSforeachdb
以及
如果存在
来检查所有数据库,然后将找到的表插入临时表中。您只需要将列名从
col1、col2、
更改为实际的表模式。尽管您需要排除包含不希望包含在数据集中的
Table1
表的任何数据库

DROP TABLE IF EXISTS #insertTable (col1 varchar(100), col2 varchar(100),...)

DECLARE @command varchar(1000)          
SELECT @command = 'USE ?            
                   EXEC(''IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ''''Table1'''')         
                            SELECT col1, col2, ... FROM Table1'')' 
            
INSERT INTO #insertTable (col1, col2, ...)          
EXEC sp_MSforeachdb @command    

通常情况下,如果在许多数据库中有一个具有相同表的设计,并且希望在单个语句中使用该数据,则表明存在设计缺陷。如果要将所有这些数据放在一个数据集中,为什么它们位于不同的数据库/表中?似乎您不应该按客户机创建数据库,而应该创建一列来表示客户机。否则,您将需要采用动态SQL方法来创建一个可伸缩的解决方案,甚至您的基本语句也将很难编写和维护。我知道这一点,但这是我所在大学的一项糟糕的任务。我在网上没有找到关于如何正确循环浏览专栏的信息。