OPENDATASOURCE(Transact-SQL)-连接到多个表

时间:2019-01-11 23:57:31

标签: sql-server

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

以下是一个典型示例,效果很好:

'markdown' => [
        'theme' => 'default',

        'paths' => [
            resource_path('views/vendor/mail'),
        ],
    ],
    'stream' => [
        'ssl' => [
            'allow_self_signed' => true,
            'verify_peer' => false,
            'verify_peer_name' => false
        ]
    ]

但是我需要将发票表与“客户”表合并,如下所示。我不确定该怎么做?请帮助

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

1 个答案:

答案 0 :(得分:1)

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

一旦有了远程服务器(在这里我将其称为“远程”),就可以使用远程服务器的四部分名称语法而不是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

祝你好运!