【问题标题】:Loop with DB names inserting插入数据库名称的循环
【发布时间】:2021-07-20 00:41:18
【问题描述】:

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

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...

我怎样才能高效、自动地做到这一点,这样我就不需要每次添加客户端时都手动更改查询?

【问题讨论】:

  • 通常情况下,如果您的设计在许多数据库中具有相同的表,并且您希望在单个语句中使用该数据,则表明存在设计缺陷。如果您想将所有这些数据放在一个数据集中,为什么它们在不同的数据库/表中?似乎你不应该有一个客户端的数据库,而是一个表示客户端的列。否则,您将需要采用动态 SQL 方法来制定可扩展的解决方案,甚至您的基本语句也只会难以编写和维护。
  • 我知道,但这是我大学的一项糟糕任务。我在 Internet 上没有找到有关如何正确循环遍历列的信息。

标签: sql sql-server tsql union dynamic-sql


【解决方案1】:

如果所有表都相同,您可以使用sp_MSforeachdbIF EXISTS 来遍历所有数据库,然后将找到的表插入到临时表中。您只需将列名从 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    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    相关资源
    最近更新 更多