跨服务器查询
在執(zhí)行跨服務(wù)器查詢之前,運(yùn)行
exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'Ad Hoc Distributed Queries',1
reconfigure
查詢結(jié)束后,運(yùn)行
exec sp_configure 'Ad Hoc Distributed Queries',0
reconfigure
exec sp_configure 'show advanced options',0
reconfigure
方法一:
用OPENDATASOURCE
下面是個(gè)跨SQLServer查詢的示例
Select TableA.*,TableB.* From OPENDATASOURCE(
'SQLOLEDB',
'Data Source=ServerA;User ID=UserID;Password=Password'
).databaseAName.dbo.TableA
Left Join
OPENDATASOURCE(
'SQLOLEDB',
'Data Source=ServerB;User ID=UserID;Password=Password'
).databaseBName.dbo.TableB On TableA.key=TableB.key
下面是個(gè)查詢的示例,它通過用于 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
-------------------------------------
SQL語句實(shí)現(xiàn)跨Sql server數(shù)據(jù)庫操作實(shí)例 - 查詢遠(yuǎn)程SQL,本地SQL數(shù)據(jù)庫與遠(yuǎn)程SQL的數(shù)據(jù)傳遞
(1)查詢192.168.1.1的數(shù)據(jù)庫(TT)表test1的數(shù)據(jù)
select * from opendatasource('sqloledb','server=192.168.1.1;uid=sa;pwd=123456;database=TT').TT.dbo.test1
(2)從192.168.1.2的數(shù)據(jù)庫(TT)表test2插入192.168.1.1數(shù)據(jù)庫(TT)的表test1去
insert into opendatasource('sqloledb','server=192.168.1.1;uid=sa;pwd=123456;database=TT').TT.dbo.test1 (id,[name],password) select id,[name],password
from opendatasource('sqloledb','server=192.168.1.2;uid=sa;pwd=123456;database=TT').TT.dbo.test2
----------------------------------------
方法二(也可以在企業(yè)管理器里添加 linkServer):
sp_addlinkedserver
創(chuàng)建一個(gè)鏈接的服務(wù)器,使其允許對(duì)分布式的、針對(duì) OLE DB 數(shù)據(jù)源的異類查詢進(jìn)行訪問。在使用 sp_addlinkedserver 創(chuàng)建鏈接的服務(wù)器之后,此服務(wù)器就可以執(zhí)行分布式查詢。如果鏈接服務(wù)器定義為 Microsoft? SQL Server?,則可執(zhí)行遠(yuǎn)程存儲(chǔ)過程。
語法
sp_addlinkedserver [ @server = ] 'server'
[ , [ @srvproduct = ] 'product_name' ]
[ , [ @provider = ] 'provider_name' ]
[ , [ @datasrc = ] 'data_source' ]
[ , [ @location = ] 'location' ]
[ , [ @provstr = ] 'provider_string' ]
[ , [ @catalog = ] 'catalog' ]
權(quán)限
執(zhí)行許可權(quán)限默認(rèn)授予 sysadmin 和 setupadmin 固定服務(wù)器角色的成員。
簡單示例:
//創(chuàng)建linkServer
exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','服務(wù)器名'
//登陸linkServer
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'用戶名','密碼'
//查詢linkServer的數(shù)據(jù)庫DataBaseA的表TableA
Select * From srv_lnk.DataBaseA.dbo.TableA
//List the tables in the linked server
EXEC sp_tables_ex txtsrv
示例
A. 使用用于 SQL Server 的 Microsoft OLE DB 提供程序
使用用于 SQL Server 的 OLE DB 創(chuàng)建鏈接服務(wù)器
下面的示例創(chuàng)建一臺(tái)名為 SEATTLESales 的鏈接服務(wù)器,該服務(wù)器使用用于 SQL Server 的 Microsoft OLE DB 提供程序。
USE master
GO
EXEC sp_addlinkedserver
'SEATTLESales',
N'SQL Server'
GO
在 SQL Server 的實(shí)例上創(chuàng)建鏈接服務(wù)器
此示例在 SQL Server 的實(shí)例上創(chuàng)建一臺(tái)名為 S1_instance1 的鏈接服務(wù)器,該服務(wù)器使用 SQL Server 的 Microsoft OLE DB 提供程序。
EXEC sp_addlinkedserver @server='S1_instance1', @srvproduct='',
@provider='SQLOLEDB', @datasrc='S1\instance1'
B. 使用用于 Jet 的 Microsoft OLE DB 提供程序
此示例創(chuàng)建一臺(tái)名為 SEATTLE Mktg 的鏈接服務(wù)器。
說明 本示例假設(shè)已經(jīng)安裝 Microsoft Access 和示例 Northwind 數(shù)據(jù)庫,且 Northwind 數(shù)據(jù)庫駐留在 C:\Msoffice\Access\Samples。
USE master
GO
-- To use named parameters:
EXEC sp_addlinkedserver
@server = 'SEATTLE Mktg',
@provider = 'Microsoft.Jet.OLEDB.4.0',
@srvproduct = 'OLE DB Provider for Jet',
@datasrc = 'C:\MSOffice\Access\Samples\Northwind.mdb'
GO
-- OR to use no named parameters:
USE master
GO
EXEC sp_addlinkedserver
'SEATTLE Mktg',
'OLE DB Provider for Jet',
'Microsoft.Jet.OLEDB.4.0',
'C:\MSOffice\Access\Samples\Northwind.mdb'
GO
C. 使用用于 Oracle 的 Microsoft OLE DB 提供程序
此示例創(chuàng)建一臺(tái)名為 LONDON Mktg 的鏈接服務(wù)器,該服務(wù)器使用用于 Oracle 的 Microsoft OLE DB 提供程序,并且假設(shè)此 Oracle 數(shù)據(jù)庫的 SQL*Net 別名為 MyServer。
USE master
GO
-- To use named parameters:
EXEC sp_addlinkedserver
@server = 'LONDON Mktg',
@srvproduct = 'Oracle',
@provider = 'MSDAORA',
@datasrc = 'MyServer'
GO
-- OR to use no named parameters:
USE master
GO
EXEC sp_addlinkedserver
'LONDON Mktg',
'Oracle',
'MSDAORA',
'MyServer'
GO
D. 將 data_source 參數(shù)與用于 ODBC 的 Microsoft OLE DB 提供程序一起使用
此示例創(chuàng)建一臺(tái)名為 SEATTLE Payroll 的鏈接服務(wù)器,該服務(wù)器使用用于 ODBC 的 Microsoft OLE DB 提供程序和 data_source 參數(shù)。
說明 在執(zhí)行 sp_addlinkedserver 之前,必須在服務(wù)器上將指定的 ODBC 數(shù)據(jù)源名稱定義為系統(tǒng) DSN。
USE master
GO
-- To use named parameters:
EXEC sp_addlinkedserver
@server = 'SEATTLE Payroll',
@provider = 'MSDASQL',
@datasrc = 'LocalServer'
GO
-- OR to use no named parameters:
USE master
GO
EXEC sp_addlinkedserver
'SEATTLE Payroll',
'',
'MSDASQL',
'LocalServer'
GO
E. 將 provider_string 參數(shù)與用于 ODBC 的 Microsoft OLE DB 提供程序一起使用
此示例創(chuàng)建一臺(tái)名為 LONDON Payroll 的鏈接服務(wù)器,該服務(wù)器使用用于 ODBC 的 Microsoft OLE DB 提供程序和 provider_string 參數(shù)。
說明 有關(guān) ODBC 連接字符串的更多信息,請(qǐng)參見 SQLDriverConnect 和如何分配句柄并與 SQL Server (ODBC) 連接。
USE master
GO
-- To use named parameters:
EXEC sp_addlinkedserver
@server = 'LONDON Payroll',
@provider = 'MSDASQL',
@provstr = 'DRIVER={SQL Server};SERVER=MyServer;UID=sa;PWD=;'
GO
-- OR to use no named parameters:
USE master
GO
EXEC sp_addlinkedserver
'LONDON Payroll',
'',
'MSDASQL',
NULL,
NULL,
'DRIVER={SQL Server};SERVER=MyServer;UID=sa;PWD=;'
GO
F. 在 Excel 電子表格上使用用于 Jet 的 Microsoft OLE DB 提供程序
若要?jiǎng)?chuàng)建使用用于 Jet 的 Microsoft OLE DB 提供程序以訪問 Excel 電子表格的鏈接服務(wù)器定義,請(qǐng)首先在 Excel 中創(chuàng)建一個(gè)命名的范圍以指定要在 Excel 工作表中選擇的行和列。然后,可將此范圍的名稱引用為分布式查詢中的表名稱。
EXEC sp_addlinkedserver 'ExcelSource',
'Jet 4.0',
'Microsoft.Jet.OLEDB.4.0',
'c:\MyData\DistExcl.xls',
NULL,
'Excel 5.0'
GO
為了訪問 Excel 電子表格中的數(shù)據(jù),請(qǐng)將某個(gè)范圍內(nèi)的單元與某個(gè)名稱相關(guān)聯(lián)。通過將范圍的名稱用作表名稱,可以訪問指定的已命名范圍。下列查詢利用前面設(shè)置的鏈接服務(wù)器,可訪問稱為 SalesData 的命名范圍。
SELECT *
FROM EXCEL...SalesData
GO
G. 使用用于檢索服務(wù)的 Microsoft OLE DB 提供程序
此示例創(chuàng)建一臺(tái)鏈接服務(wù)器,并且使用 OPENQUERY 從為檢索服務(wù)啟用的鏈接服務(wù)器和文件系統(tǒng)中檢索信息。
EXEC sp_addlinkedserver FileSystem,
'Index Server',
'MSIDXS',
'Web'
GO
USE pubs
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'yEmployees')
DROP TABLE yEmployees
GO
CREATE TABLE yEmployees
(
id int NOT NULL,
lname varchar(30) NOT NULL,
fname varchar(30) NOT NULL,
salary money,
hiredate datetime
)
GO
INSERT yEmployees VALUES
(
10,
'Fuller',
'Andrew',
$60000,
'9/12/98'
)
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_NAME = 'DistribFiles')
DROP VIEW DistribFiles
GO
CREATE VIEW DistribFiles
AS
SELECT *
FROM OPENQUERY(FileSystem,
'SELECT Directory,
FileName,
DocAuthor,
Size,
Create,
Write
FROM SCOPE('' "c:\My Documents" '')
WHERE CONTAINS(''Distributed'') > 0
AND FileName LIKE ''%.doc%'' ')
WHERE DATEPART(yy, Write) = 1998
GO
SELECT *
FROM DistribFiles
GO
SELECT Directory,
FileName,
DocAuthor,
hiredate
FROM DistribFiles D, yEmployees E
WHERE D.DocAuthor = E.FName + ' ' + E.LName
GO
H. 使用用于 Jet 的 Microsoft OLE DB 提供程序訪問文本文件
此示例創(chuàng)建一臺(tái)直接訪問文本文件的鏈接服務(wù)器,而沒有將這些文件鏈接為 Access .mdb 文件中的表。提供程序是 Microsoft.Jet.OLEDB.4.0,提供程序字符串為"Text"。
數(shù)據(jù)源是包含文本文件的目錄的完整路徑名。schema.ini 文件(描述文本文件的結(jié)構(gòu))必須與此文本文件存在于相同的目錄中。有關(guān)創(chuàng)建 schema.ini 文件的更多信息,請(qǐng)參見 Jet 數(shù)據(jù)庫引擎文檔。
--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 提供程序
下面的示例創(chuàng)建一臺(tái)名為 DB2 的鏈接服務(wù)器,該服務(wù)器使用用于 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
盡管查詢可能返回多個(gè)結(jié)果集,但是 OPENQUERY 只返回第一個(gè)。
語法
OPENQUERY ( linked_server , 'query' )
參數(shù)
linked_server
一個(gè)標(biāo)識(shí)符,表示鏈接的服務(wù)器的名稱。
'query'
在鏈接的服務(wù)器中執(zhí)行的查詢字符串。
注釋
OPENQUERY 不接受參數(shù)變量。
示例
下面的示例利用用于 Oracle 的 Microsoft OLE DB 提供程序針對(duì) Oracle 數(shù)據(jù)庫創(chuàng)建一個(gè)名為 OracleSvr 鏈接的服務(wù)器。然后,該示例對(duì)此鏈接的服務(wù)器使用一個(gè)直接傳遞查詢。
說明 本示例假定已經(jīng)創(chuàng)建了一個(gè)名為 ORCLDB 的 Oracle 數(shù)據(jù)庫別名。
EXEC sp_addlinkedserver 'OracleSvr',
'Oracle 7.3',
'MSDAORA',
'ORCLDB'
GO
SELECT *
FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles')
GO
方法四:
OPENROWSET
包含訪問 OLE DB 數(shù)據(jù)源中的遠(yuǎn)程數(shù)據(jù)所需的全部連接信息。當(dāng)訪問鏈接服務(wù)器中的表時(shí),這種方法是一種替代方法,并且是一種使用 OLE DB 連接并訪問遠(yuǎn)程數(shù)據(jù)的一次性的、特殊的方法??梢栽诓樵兊?FROM 子句中像引用表名那樣引用 OPENROWSET 函數(shù)。依據(jù) OLE DB 提供程序的能力,還可以將 OPENROWSET 函數(shù)引用為 INSERT、UPDATE 或 DELETE 語句的目標(biāo)表。盡管查詢可能返回多個(gè)結(jié)果集,然而 OPENROWSET 只返回第一個(gè)。
語法
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 數(shù)據(jù)庫中的 authors 表,該數(shù)據(jù)庫在一個(gè)名為 seattle1 的遠(yuǎn)程服務(wù)器上。從 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 與對(duì)象及用于 ODBC 的 OLE DB 提供程序一起使用
下面的示例使用用于 ODBC 的 OLE DB 提供程序以及 SQL Server ODBC 驅(qū)動(dòng)程序訪問 pubs 數(shù)據(jù)庫中的 authors 表,該數(shù)據(jù)庫在一個(gè)名為 seattle1 的遠(yuǎn)程服務(wù)器中。提供程序用在 ODBC 提供程序所用的 ODBC 語法中指定的 provider_string 進(jìn)行初始化,定義返回的行集時(shí)使用 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 數(shù)據(jù)庫中的 orders 表。
說明 下面的示例假定已經(jīng)安裝了 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 中的另一個(gè)表
下面的示例從本地 SQL Server Northwind 數(shù)據(jù)庫的 customers 表中,以及存儲(chǔ)在相同計(jì)算機(jī)上 Access Northwind 數(shù)據(jù)庫的 orders 表中選擇所有數(shù)據(jù)
說明 下面的示例假定已經(jīng)安裝了 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
聯(lián)盟快賣 商人,生意人,待創(chuàng)業(yè)人士在此可以共贏互利 期待你的加入 群號(hào):140809277
總結(jié)
- 上一篇: jrtplib 打包做了哪些事_30岁前
- 下一篇: 文本快速分类利器fasttext使用心得