[SQL SERVER] 跨服務器查詢

[SQL SERVER] 跨服務器查詢

方法一:
用OPENDATASOURCE
下面是個跨SQLServer查詢的示例

下面是個查詢的示例,它通過用於 Jet 的 OLE DB 提供程序查詢 Excel 電子表格。


方法二(也可以在企業管理器裏添加 linkServer):
sp_addlinkedserver
創建一個鏈接的服務器,使其允許對分佈式的、針對 OLE DB 數據源的異類查詢進行訪問。在使用 sp_addlinkedserver 創建鏈接的服務器之後,此服務器就可以執行分佈式查詢。如果鏈接服務器定義爲 Microsoft? SQL Server?,則可執行遠程存儲過程。

語法

 

示例
A. 使用用於 SQL Server 的 Microsoft OLE DB 提供程序
使用用於 SQL Server 的 OLE DB 創建鏈接服務器
下面的示例創建一臺名爲 SEATTLESales 的鏈接服務器,該服務器使用用於 SQL Server 的 Microsoft OLE DB 提供程序。

USE master
GO
EXEC sp_addlinkedserver
    'SEATTLESales',
    N'SQL Server'
GO

在 SQL Server 的實例上創建鏈接服務器
此示例在 SQL Server 的實例上創建一臺名爲 S1_instance1 的鏈接服務器,該服務器使用 SQL Server 的 Microsoft OLE DB 提供程序。

EXEC    sp_addlinkedserver    @server='S1_instance1', @srvproduct='',
                                @provider='SQLOLEDB', @datasrc='S1/instance1'

B. 使用用於 Jet 的 Microsoft OLE DB 提供程序
此示例創建一臺名爲 SEATTLE Mktg 的鏈接服務器。

 

說明  本示例假設已經安裝 Microsoft Access 和示例 Northwind 數據庫,且 Northwind 數據庫駐留在

C. 使用用於 Oracle 的 Microsoft OLE DB 提供程序
此示例創建一臺名爲 LONDON Mktg 的鏈接服務器,該服務器使用用於 Oracle 的 Microsoft OLE DB 提供程序,並且假設此 Oracle 數據庫的 SQL*Net 別名爲 MyServer。

D. 將 data_source 參數與用於 ODBC 的 Microsoft OLE DB 提供程序一起使用
此示例創建一臺名爲 SEATTLE Payroll 的鏈接服務器,該服務器使用用於 ODBC 的 Microsoft OLE DB 提供程序和 data_source 參數。

 

說明  在執行 sp_addlinkedserver 之前,必須在服務器上將指定的 ODBC 數據源名稱定義爲系統 DSN。


E. 將 provider_string 參數與用於 ODBC 的 Microsoft OLE DB 提供程序一起使用
此示例創建一臺名爲 LONDON Payroll 的鏈接服務器,該服務器使用用於 ODBC 的 Microsoft OLE DB 提供程序和 provider_string 參數。

 

說明  有關 ODBC 連接字符串的更多信息,請參見 SQLDriverConnect 和如何分配句柄並與 SQL Server (ODBC) 連接。


F. 在 Excel 電子表格上使用用於 Jet 的 Microsoft OLE DB 提供程序
若要創建使用用於 Jet 的 Microsoft OLE DB 提供程序以訪問 Excel 電子表格的鏈接服務器定義,請首先在 Excel 中創建一個命名的範圍以指定要在 Excel 工作表中選擇的行和列。然後,可將此範圍的名稱引用爲分佈式查詢中的表名稱。

EXEC sp_addlinkedserver 'ExcelSource',
   'Jet 4.0',
   'Microsoft.Jet.OLEDB.4.0',
   'c:/MyData/DistExcl.xls',
   NULL,
   'Excel 5.0'
GO

爲了訪問 Excel 電子表格中的數據,請將某個範圍內的單元與某個名稱相關聯。通過將範圍的名稱用作表名稱,可以訪問指定的已命名範圍。下列查詢利用前面設置的鏈接服務器,可訪問稱爲 SalesData 的命名範圍。

SELECT *
FROM EXCEL...SalesData
GO

G. 使用用於檢索服務的 Microsoft OLE DB 提供程序
此示例創建一臺鏈接服務器,並且使用 OPENQUERY 從爲檢索服務啓用的鏈接服務器和文件系統中檢索信息。

H. 使用用於 Jet 的 Microsoft OLE DB 提供程序訪問文本文件
此示例創建一臺直接訪問文本文件的鏈接服務器,而沒有將這些文件鏈接爲 Access .mdb 文件中的表。提供程序是 Microsoft.Jet.OLEDB.4.0,提供程序字符串爲"Text"。

數據源是包含文本文件的目錄的完整路徑名。schema.ini 文件(描述文本文件的結構)必須與此文本文件存在於相同的目錄中。有關創建 schema.ini 文件的更多信息,請參見 Jet 數據庫引擎文檔。

--Create a linked server
EXEC sp_addlinkedserver txtsrv, 'Jet 4.0',
   'Microsoft.Jet.OLEDB.4.0',
   'c:/data/distqry',
   NULL,
   'Text'
GO

--Set up login mappings
EXEC sp_addlinkedsrvlogin txtsrv, FALSE, Admin, NULL
GO

--List the tables in the linked server
EXEC sp_tables_ex txtsrv
GO

--Query one of the tables: file1#txt
--using a 4-part name
SELECT *
FROM txtsrv...[file1#txt]

I. 使用用於 DB2 的 Microsoft OLE DB 提供程序
下面的示例創建一臺名爲 DB2 的鏈接服務器,該服務器使用用於 DB2 的 Microsoft OLE DB 提供程序。

EXEC sp_addlinkedserver
   @server='DB2',
   @srvproduct='Microsoft OLE DB Provider for DB2',
   @catalog='DB2',
   @provider='DB2OLEDB',
   @provstr='Initial Catalog=PUBS;Data Source=DB2;HostCCSID=1252;Network Address=XYZ;Network Port=50000;Package Collection=admin;Default Schema=admin;'

 


方法三:
OPENQUERY
儘管查詢可能返回多個結果集,但是 OPENQUERY 只返回第一個。

語法
OPENQUERY ( linked_server , 'query' )

參數
linked_server

一個標識符,表示鏈接的服務器的名稱。

'query'

在鏈接的服務器中執行的查詢字符串。

註釋
OPENQUERY 不接受參數變量。

示例
下面的示例利用用於 Oracle 的 Microsoft OLE DB 提供程序針對 Oracle 數據庫創建一個名爲 OracleSvr 鏈接的服務器。然後,該示例對此鏈接的服務器使用一個直接傳遞查詢。

說明  本示例假定已經創建了一個名爲 ORCLDB 的 Oracle 數據庫別名。

EXEC sp_addlinkedserver 'OracleSvr',
   'Oracle 7.3',
   'MSDAORA',
   'ORCLDB'
GO
SELECT *
FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles')
GO

方法四:
OPENROWSET
包含訪問 OLE DB 數據源中的遠程數據所需的全部連接信息。當訪問鏈接服務器中的表時,這種方法是一種替代方法,並且是一種使用 OLE DB 連接並訪問遠程數據的一次性的、特殊的方法。可以在查詢的 FROM 子句中像引用表名那樣引用 OPENROWSET 函數。依據 OLE DB 提供程序的能力,還可以將 OPENROWSET 函數引用爲 INSERT、UPDATE 或 DELETE 語句的目標表。儘管查詢可能返回多個結果集,然而 OPENROWSET 只返回第一個。

語法
OPENROWSET ( 'provider_name'
    , { 'datasource' ; 'user_id' ; 'password'
        | 'provider_string' }
    , { [ catalog.] [ schema.] object
        | 'query' }
    )

示例
A. 將 OPENROWSET 與 SELECT 語句及用於 SQL Server 的 Microsoft OLE DB 提供程序一起使用
下面的示例使用用於 SQL Server 的 Microsoft OLE DB 提供程序訪問 pubs 數據庫中的 authors 表,該數據庫在一個名爲 seattle1 的遠程服務器上。從 datasource、user_id 及 password 中初始化提供程序,並且使用 SELECT 語句定義返回的行集。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('SQLOLEDB','seattle1';'sa';'MyPass',
   'SELECT * FROM pubs.dbo.authors ORDER BY au_lname, au_fname') AS a
GO

B. 將 OPENROWSET 與對象及用於 ODBC 的 OLE DB 提供程序一起使用
下面的示例使用用於 ODBC 的 OLE DB 提供程序以及 SQL Server ODBC 驅動程序訪問 pubs 數據庫中的 authors 表,該數據庫在一個名爲 seattle1 的遠程服務器中。提供程序用在 ODBC 提供程序所用的 ODBC 語法中指定的 provider_string 進行初始化,定義返回的行集時使用 catalog.schema.object 語法。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('MSDASQL',
   'DRIVER={SQL Server};SERVER=seattle1;UID=sa;PWD=MyPass',
   pubs.dbo.authors) AS a
ORDER BY a.au_lname, a.au_fname
GO

C. 使用用於 Jet 的 Microsoft OLE DB 提供程序
下面的示例通過用於 Jet 的 Microsoft OLE DB 提供程序訪問 Microsoft Access Northwind 數據庫中的 orders 表。

 

說明  下面的示例假定已經安裝了 Access。


USE pubs
GO
SELECT a.*
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
   'c:/MSOffice/Access/Samples/northwind.mdb';'admin';'mypwd', Orders)
   AS a
GO

D. 使用 OPENROWSET 和 INNER JOIN 中的另一個表
下面的示例從本地 SQL Server Northwind 數據庫的 customers 表中,以及存儲在相同計算機上 Access Northwind 數據庫的 orders 表中選擇所有數據

 

說明  下面的示例假定已經安裝了 Access。


USE pubs
GO
SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c INNER JOIN
   OPENROWSET('Microsoft.Jet.OLEDB.4.0',
   'c:/MSOffice/Access/Samples/northwind.mdb';'admin';'mypwd', Orders)
   AS o
   ON c.CustomerID = o.CustomerID
GO

 

發佈了32 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章