如何跨多个数据库和多个服务器配置具有多个 UNION 的 INSERT INTO 查询

问题描述 投票:0回答:1

我见过从多个数据库或多个服务器中的表中提取日期的 INSERT 查询示例,但我尚未成功地将所有这些放在一起。

我有一个查询,它使用多个表来生成所请求数据的扁平表。 我可以在单个服务器上的单个数据库上运行它,没有任何问题。

目标是扩展此查询以从跨 6 个服务器的 9 个数据库中提取数据。 这些数据库都具有相同的架构和格式。

当我进行 INSERT 并使用 UNION 与同一服务器上的两个数据库时,我没有任何问题。 当我尝试添加第二个服务器时,查询显示失败。 将鼠标悬停在 FROM 语句中的表引用上,我得到“无效的对象名称”。 我通过从对象资源管理器中拖动元素来构建对象名称,以确保不存在拼写错误问题。

我现在拥有的是:

INTO [服务器1].[数据库1].[dbo].[FlattenedTable](字段1、字段2、字段3.....) (选择字段1、字段2、字段3…… 来自 [服务器 1]、[数据库 2].[dbo].[表 1] [Server1]、[Database2].[dbo].[Table1].[Field1] = [Server1]、[Database2].[dbo] 上的内联接 [Server1]、[Database2].[dbo].[Table2]。 [表2].[字段1]) 联盟 (选择字段1、字段2、字段3…… 来自 [Server1]、[Database3].[dbo].[Table1] [Server1]、[Database3].[dbo].[Table1].[Field1] = [Server1]、[Database3].[dbo] 上的内联接 [Server1]、[Database3].[dbo].[Table2]。 [表2].[字段1]) 联盟 (选择字段1、字段2、字段3…… 来自 [Server2]、[Database3].[dbo].[Table1] [Server2]、[Database3].[dbo].[Table1].[Field1] = [Server2]、[Database3].[dbo] 上的内联接 [Server2]、[Database3].[dbo].[Table2]。 [表2].[字段1])

第二个服务器的整个查询用红色下划线标出。 将鼠标悬停在 FROM 语句中的表引用上,我得到“无效的对象名称”。 我通过从对象资源管理器中拖动元素来构建对象名称,以确保不存在拼写错误问题。

我希望我有一个简单的语法问题 - 逗号、括号之类的东西 - 导致它在最后一个 UNION 上卡住。

同样,目标是有 8 个 UNION 从 5 个服务器引入数据。

union linked-server
1个回答
0
投票

看起来您正在尝试使用由四部分组成的名称来引用不同服务器上的表,但语法不太正确。

当引用不同服务器上的表时,您需要使用以下格式的四部分名称:

[服务器名称].[数据库名称].[架构名称].[表名称]

但是,在您的查询中,您用逗号分隔服务器名称和数据库名称,这是不正确的。

尝试更改查询以使用正确的四部分名称语法,如下所示:

INTO [Server1].[Database1].[dbo].[FlattenedTable] (field1, field2, field3.....) ( SELECT field1, field2, field3......  FROM [Server1].[Database2].[dbo].[Table1]  INNER JOIN [Server1].[Database2].[dbo].[Table2]  ON [Server1].[Database2].[dbo].[Table1].[Field1] = [Server1].[Database2].[dbo].[Table2].[Field1] ) UNION ( SELECT field1, field2, field3......  FROM [Server1].[Database3].[dbo].[Table1]  INNER JOIN [Server1].[Database3].[dbo].[Table2]  ON [Server1].[Database3].[dbo].[Table1].[Field1] = [Server1].[Database3].[dbo].[Table2].[Field1] ) UNION ( SELECT field1, field2, field3......  FROM [Server2].[Database3].[dbo].[Table1]  INNER JOIN [Server2].[Database3].[dbo].[Table2]  ON [Server2].[Database3].[dbo].[Table1].[Field1] = [Server2].[Database3].[dbo].[Table2].[Field1] ) 

此外,请确保服务器已链接并且可以从运行查询的服务器访问数据库。您可以通过运行以下查询来检查链接服务器:

SELECT * FROM sys.servers

这将向您显示链接服务器的列表。如果您尝试访问的服务器未列出,您需要将其添加为链接服务器,然后才能访问其数据库。

此外,您可能需要使用 OPENQUERY 函数在远程服务器上执行查询,如下所示:

SELECT * FROM OPENQUERY([Server2], 'SELECT field1, field2, field3...... FROM [Database3].[dbo].[Table1] INNER JOIN [Database3].[dbo].[Table2] ON [Database3].[dbo].[Table1].[Field1] = [Database3].[dbo].[Table2].[Field1]')

这将在远程服务器上执行查询并将结果返回到本地服务器。

© www.soinside.com 2019 - 2024. All rights reserved.