首页 > 解决方案 > OPENDATASOURCE (Transact-SQL) - 连接到多个表

问题描述

我有一个 OPENDATASROUCE 的用例。但是,我的 SQL 查询有多个带有左连接的表。大多数示例只有一张表。如果我有 2 个表(第 2 个表已离开连接),我如何连接

下面是一个典型的例子,效果很好:

   SELECT   *
    FROM OPENDATASOURCE('SQLNCLI', 'Data Source=RemoteServerName;Integrated Security=SSPI').Billing.dbo.Invoices

但我需要将发票表与下面的“客户”表连接起来。我不知道我是怎么做到的??请帮忙

 SELECT *
FROM OPENDATASOURCE('SQLNCLI', 'Data Source=RemoteServerName;Integrated Security=SSPI').Billing.dbo.Invoices as inv
left join Billing.dbo.customers as cust
on inv.customer = cust.customer

标签: sql-server

解决方案


OPENDATASOURCE 是使用 SQL Server 中的“链接服务器”或“分布式查询”功能与远程服务器通信的一种方式。但是,这可能不是您在这种情况下使用的最佳路径,因为它不允许 SQL Server 查询优化器重写查询并将部分查询推送到远程源(可能会减少返回的行数通过较慢的网络连接与您的本地数据库给您)。如果可能的话,创建一个实际的链接服务器会在这里为您提供帮助。这将使您可以选择对优化器说“这两个表来自同一个远程源”。然后优化器可以考虑将单个查询远程连接到将这两个表连接在一起的远程服务器的计划,应用任何过滤器和 group by 子句,

这是添加链接服务器的机制: https ://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-addlinkedserver-transact-sql?view=sql-server-2017

一旦你有了一个远程服务器(我在这里称之为“远程”),你可以使用远程服务器的 4 部分名称语法而不是使用 OPENDATASOURCE 来编写查询。

SELECT * FROM REMOTE.Billing.DBO.Invoices LEFT JOIN REMOTE.Billing.DBO.Invoices on <join condition> <WHERE clause>

这是一篇关于链接服务器如何在幕后工作的论文,它应该给你一个概念性的概述,说明为什么这种方法可能更适合你: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1。 1.59.8007

祝你好运!


推荐阅读