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方法来创建一个可伸缩的解决方案,甚至您的基本语句也将很难编写和维护。我知道这一点,但这是我所在大学的一项糟糕的任务。我在网上没有找到关于如何正确循环浏览专栏的信息。