需求
兩個服務器上對應的SQL Server數據庫服務,關聯兩張表查詢數據。
單表查詢
select * from OPENDATASOURCE('SQLOLEDB','Data Source=遠程實列名;User ID=sa;Password=密碼').庫名.dbo.表名
例如:
select * from OPENDATASOURCE('SQLOLEDB','Data Source=192.168.1.131;User ID=sa;Password=123456').BaoGuang_QrCode.dbo.T_BC_BaseInfo
多表關聯查詢(下列服務器名是隨便寫的吆)
SELECT * FROM OPENROWSET('SQLOLEDB','192.168.1.128';'sa';'ele3561424',EleList.dbo.barCode) A
JOIN OPENROWSET('SQLOLEDB','192.168.1.131';'sa';'123456',BaoGuang_QrCode.dbo.T_BC_BaseInfo) B
ON A.BarCode = B.BarCode
WHERE A.createDate>'2019-12-31 00:00:00'
select * from OPENROWSET('SQLOLEDB','192.168.10.28';'sa';'ele3561424',EleList.dbo.barCode) D
where D.BarCode not in (
SELECT A.BarCode FROM OPENROWSET('SQLOLEDB','192.168.10.28';'sa';'ele3561424',EleList.dbo.barCode) A
JOIN OPENROWSET('SQLOLEDB','192.168.10.168';'sa';'123qwe',BaoGuang_QrCode.dbo.T_BC_BaseInfo) B
ON A.BarCode = B.BarCode
WHERE A.createDate>'2019-12-31 00:00:00')
and D.createDate>'2019-12-31 00:00:00'
and D.BarCode like'%2001%'
OPENDATASOURCE
不使用鏈接的服務器名,而提供特殊的連接信息,並將其作為四部分對象名的一部分。
語法
OPENDATASOURCE ( provider_name, init_string )
參數
provider_name
注冊為用於訪問數據源的 OLE DB 提供程序的 PROGID 的名稱。provider_name 的數據類型為 char,沒有默認值。
init_string
連接字符串,這些字符串將要傳遞給目標提供程序的 IDataInitialize 接口。提供程序字符串語法是以關鍵字值對為基礎的,這些關鍵字值對由分號隔開,例如:"keyword1=value; keyword2=value."
在 Microsoft? Data Access SDK 中定義了基本語法。有關所支持的特定關鍵字值對的信息,請參見提供程序中的文檔。下表列出 init_string 參數中最常用的關鍵字。
關鍵字 OLE DB 屬性 有效值和描述
數據源 DBPROP_INIT_DATASOURCE 要連接的數據源的名稱。不同的提供程序用不同的方法對此進行解釋。對於 SQL Server OLE DB 提供程序來說,這會指明服務器的名稱。對於 Jet OLE DB 提供程序來說,這會指明 .mdb 文件或 .xls 文件的完整路徑。
位置 DBPROP_INIT_LOCATION 要連接的數據庫的位置。
擴展屬性 DBPROP_INIT_PROVIDERSTRING 提供程序特定的連接字符串。
連接超時 DBPROP_INIT_TIMEOUT 超時值,在該超時值后,連接嘗試將失敗。
用戶 ID DBPROP_AUTH_USERID 用於該連接的用戶 ID。
密碼 DBPROP_AUTH_PASSWORD 用於該連接的密碼。
目錄 DBPROP_INIT_CATALOG 連接到數據源時的初始或默認的目錄名稱。
注釋
OPENDATASOURCE 函數可以在能夠使用鏈接服務器名的相同 Transact-SQL 語法位置中使用。因此,就可以將 OPENDATASOURCE 用作四部分名稱的第一部分,該名稱指的是 SELECT、INSERT、UPDATE 或 DELETE 語句中的表或視圖的名稱;或者指的是 EXECUTE 語句中的遠程存儲過程。當執行遠程存儲過程時,OPENDATASOURCE 應該指的是另一個 SQL Server。OPENDATASOURCE 不接受參數變量。
與 OPENROWSET 函數類似,OPENDATASOURCE 應該只引用那些不經常訪問的 OLE DB 數據源。對於訪問次數稍多的任何數據源,請為它們定義鏈接的服務器。無論 OPENDATASOURCE 還是 OPENROWSET 都不能提供鏈接的服務器定義的全部功能,例如,安全管理以及查詢目錄信息的能力。每次調用 OPENDATASOURCE 時,都必須提供所有的連接信息(包括密碼)。
示例
下面的示例訪問來自某個表的數據,該表在 SQL Server 的另一個實例中。
SELECT *
FROM OPENDATASOURCE(
'SQLOLEDB',
'Data Source=ServerName;User ID=MyUID;Password=MyPass'
).Northwind.dbo.Categories
下面是個查詢的示例,它通過用於 Jet 的 OLE DB 提供程序查詢 Excel 電子表格。
SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:/Finance/account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
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' }
)
參數
'provider_name' 字符串,它代表在注冊表中指定的 OLE DB 提供程序的友好名。provider_name 沒有默認值。
'datasource' 字符串常量,它對應着某個特定的 OLE DB 數據源。datasource 是將被傳遞到提供程序 IDBProperties 接口以初始化提供程序的 DBPROP_INIT_DATASOURCE 屬性。通常,這個字符串包含數據庫文件的名稱、數據庫服務器的名稱,或者提供程序能理解的用於查找數據庫的名稱。
'user_id' 字符串常量,它是傳遞到指定 OLE DB 提供程序的用戶名。user_id 為連接指定安全上下文,並將它作為 DBPROP_AUTH_USERID 屬性傳遞進來以初始化提供程序。
'password' 字符串常量,它是將被傳遞到 OLE DB 提供程序的用戶密碼。當初始化提供程序時,將 password 作為 DBPROP_AUTH_PASSWORD 屬性傳遞進來。
'provider_string' 提供程序特定的連接字符串,將它作為 DBPROP_INIT_PROVIDERSTRING 屬性傳遞進來以初始化 OLE DB 提供程序。通常 provider_string 封裝初始化提供程序所需的所有連接信息。
catalog 目錄或數據庫的名稱,其中駐留着指定的對象。
schema 架構的名稱或指定對象的對象所有者名稱。
object 對象名稱,它唯一地標識出將要操作的對象。
'query' 是字符串常量,發送到提供程序並由提供程序執行。Microsoft? SQL Server? 不處理該查詢,但處理由提供程序返回的查詢結果(直接傳遞查詢)。對於有些提供程序,它們並沒有通過表名而是通過命令語言表現自己的表格格式數據,那么將直接傳遞查詢用於這些提供程序是非常有用的。只要查詢提供程序支持 OLE DB Command 對象及其強制接口,那么在遠程服務器上就支持直接傳遞查詢。有關更多信息,請參見 SQL Server OLE DB 程序員參考。
注釋
如果 OLE DB 提供程序在指定的數據源中支持多個目錄和架構,那么就需要目錄及架構名稱。如果 OLE DB 提供程序並不支持目錄和架構,那么可以省略 catalog 及 schema 的值。
如果提供程序只支持架構名,那么必須指定一個兩部分名稱,形式為 schema.object。如果提供程序只支持目錄名,那么必須指定一個三部分名稱,形式為 catalog.schema.object。
OPENROWSET 不接受參數變量。
權限
OPENROWSET 權限由傳遞到 OLE DB 提供程序的用戶名的權限確定。
示例
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
上面兩個方法的示例:
[OpenDataSource]
1.
Select * from OpenDataSource('SQLOLEDB','Data Source=ServerName;User ID=MyID;Password=MyPass').DBName.DBO.TableName
2.通過用Jet的OLEDB提供程序查詢Excel電子表格
Select * from OpenDataSource('MICROSOFT.JET.OLEDB.4.0','Data Source="c:/account.xls";User ID=Admin;Password=;Extended Properties=Excel 5.0')...Xactions
[OpenRowSet]
格式:
OpenRowSet('Provider_Name','{'DataSource';'UserID';'Password'|'Provider_String'},{[CateLog.][Schema.]Object|'Query'})
1.
Select A.* from OpenRowSet('SQLOLEDB','ServerName';'UserID';'Password','Select * from pubs.dbo.authors',Orders) as A
2.
Select A.* from OperRowset('MSDASQL','DRIVER={SQL Server};Server=ServerName;UID=UserID;PWD=MyPass',pus.dbo.Authors) as A
3.Select A.* from OperRowSet('MICROSOFT.JET.OLEDB.4.0','c:/access/northowind.mdb';'UserID';'Password',Orders) AS A
4.Select C.* ,O.* from Northowind.dbo.customers c
inner join OpenRowSet('MICROSOFT.JET.OLEDB.4.0','c:/access/northowind.mdb';'Admin';'MyPass',Orders) as o
on c.CustomerID = o.CustomerID
5.Select * From OpenRowSet('MICROSOFT.JET.OLEDB.4.0','EXCEL 5.0;HDR=YES;IMEX=2;DataBase=D:/Book1.XLS',[sheet1$])