最近几个月,我们已转换到新的软件应用程序。迁移团队(供应商)保留了旧数据库。他们使用新供应商的数据库结构将部分旧数据转换为“存档”数据库。(这样,新软件可用于访问存档数据 - 从而消除了对旧软件许可证的需求。)自转换以来,我们公司已将数据输入新数据库。
我需要从所有三个数据库(在两个 SQLserver2005 服务器上)提取数据。我想使用“联合”查询来提取所有数据并自动消除任何重复记录。
我参加了“谷歌搜索”并阅读了一些资料。其中一个选项是链接服务器。我遇到的另一个选项是 OPENDATASOURCE。
我的三个数据库位于两个SQLserver上:
- “服务器箱 1”:包含服务器 FAYRMS1(SQL Server 9.0.3042)和一个名为 VSI_DATA 的旧遗留数据数据库
- “服务器箱 2”:包含服务器 FAYOSSIRMS (SQL Server 9.0.1399)、一个名为 rmsconv 的存档数据数据库和一个名为 rms 的“实时”数据数据库
我可以单独“连接”所有三个数据库(Windows 身份验证)。连接到每个特定数据库后,我可以执行返回所需数据的查询。当我连接到一个数据库并尝试从另一个数据库提取数据时,我遇到了麻烦。(我尝试在 FROM 子句中创建完全限定名称 - 但出现错误。我查询了 sys.servers 并发现数据库未链接。)
我在 Google 上搜索并阅读了大量资料,但还是没有找到答案。执行从 3 个数据库中提取数据的 UNION 查询的语法是什么?
答案1
如果您只是进行简单的选择,我会创建链接服务器来执行此操作。OPENDATASOURCE 不是必需的。您的查询将如下所示:
SELECT
Field1, Field2, Field3, Field4
FROM [Server1].[Database1].[MySchema].[Table1]
UNION
SELECT
Field1, Field2, Field3, Field4
FROM [Server2].[Database2].[MySchema].[Table2]
UNION
SELECT
Field1, Field2, Field3, Field4
FROM [Server3].[Database3].[MySchema].[Table3]
假设您有 3 个链接服务器,分别名为 Server1、Server2 和 Server3
对于您的环境,您实际上并没有说出您正在查询哪个实例,因此我假设您正在从具有实时数据数据库的实例进行工作。
在 FAYOSSIRMS 上创建一个指向 FAYRMS1 的链接服务器,并将其命名为 - FAYRMS1。
那么你的查询如下所示:
SELECT
[SomeData]
FROM [rms].[dbo].[Table1]
UNION
SELECT
[SomeData]
FROM [rmsconv].[dbo].[Table2]
UNION
SELECT
[SomeData]
FROM
[FAYRMS1].[VSI_DATA].[dbo].[Table3]
(假设你的模式是 dbo)
编辑
如果你被 OPENDATASOURCE 困住了,那么可以尝试一下:
SELECT
[SomeData]
FROM [rms].[dbo].[Table1]
UNION
SELECT
[SomeData]
FROM [rmsconv].[dbo].[Table2]
UNION
SELECT
[SomeData]
FROM OPENDATASOURCE('SQLNCLI','Data Source=FAYRMS1;Integrated Security=SSPI')
.VSI_DATA.dbo.Table3
这将使用 SQL Native Client 和 Windows 身份验证打开与 FAYRMS1 的连接