用openrowset連接遠程SQL或插入數(shù)據(jù)
--如果只是臨時訪問,可以直接用openrowset
--查詢示例
select * from openrowset('SQLOLEDB', 'sql服務(wù)器名'; '用戶名'; '密碼', 數(shù)據(jù)庫名.dbo.表名)
--導(dǎo)入示例
select * into 表 from openrowset('SQLOLEDB' ,'sql服務(wù)器名';'用戶名';'密碼' ,數(shù)據(jù)庫名.dbo.表名)
--創(chuàng)建鏈接服務(wù)器
exec sp_addlinkedserver?? 'srv_lnk', '', 'SQLOLEDB','遠程服務(wù)器名或ip地址'
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'用戶名','密碼'
go
--查詢示例
select * from srv_lnk.數(shù)據(jù)庫名.dbo.表名
--導(dǎo)入示例
select * into 表 from srv_lnk.數(shù)據(jù)庫名.dbo.表名
--以后不再使用時刪除鏈接服務(wù)器
exec sp_dropserver 'srv_lnk','droplogins'
go
--下面的示例訪問來自某個表的數(shù)據(jù),該表在 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:Financeaccount.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
由于項目需要,在開發(fā)過程遇上跨數(shù)據(jù)庫服務(wù)器訪問數(shù)據(jù)的問題.
在網(wǎng)絡(luò)上一搜,資料確實不少,不過解決自己的問題也花了大半天的時候,在這里花些時間總結(jié)一下.
1.確立問題
由于需要進行跨數(shù)據(jù)庫服務(wù)器的查詢操作,所以我個人把其定位于分布式查詢數(shù)據(jù)的問題.
2.解決方案
第一個概念.鏈接服務(wù)器.
鏈接服務(wù)器一般用來處理分布式查詢。當客戶端應(yīng)用程序通過鏈接服務(wù)器執(zhí)行分布式查詢時,SQL Server 將分析該命令,并向 OLE DB 發(fā)送行集請求。行集請求的形式可以是對提供程序執(zhí)行查詢或從提供程序打開基表。
分布式查詢可以訪問來自多種異類數(shù)據(jù)源的數(shù)據(jù),而這些數(shù)據(jù)可存儲在相同或不同的計算機上。Microsoft? SQL Server? 2000 通過使用 OLE DB(Microsoft 通用數(shù)據(jù)訪問應(yīng)用程序接口 (API) 規(guī)范)支持分布式查詢。
鏈接服務(wù)器配置允許 Microsoft? SQL Server? 對其它服務(wù)器上的 OLE DB 數(shù)據(jù)源執(zhí)行命令。鏈接服務(wù)器具有以下優(yōu)點:
遠程服務(wù)器訪問。
對整個企業(yè)內(nèi)的異類數(shù)據(jù)源執(zhí)行分布式查詢、更新、命令和事務(wù)的能力。
能夠以相似的方式確定不同的數(shù)據(jù)源。
鏈接服務(wù)器組件
鏈接服務(wù)器的定義指定了 OLE DB 提供程序和 OLE DB 數(shù)據(jù)源。
OLE DB 提供程序是管理特定數(shù)據(jù)源和與特定數(shù)據(jù)源進行交互的動態(tài)鏈接庫 (DLL)。OLE DB 數(shù)據(jù)源標識可通過 OLE DB 訪問的特定數(shù)據(jù)庫。盡管通過鏈接服務(wù)器的定義所查詢的數(shù)據(jù)源通常是數(shù)據(jù)庫,但也存在適用于多種文件和文件格式的 OLE DB 提供程序,包括文本文件、電子表格數(shù)據(jù)和全文內(nèi)容檢索結(jié)果。下表說明了最常用于 SQL Server 的 OLE DB 提供程序和數(shù)據(jù)源示例。
OLE DB提供程序???????????????????????????????? OLE DB 數(shù)據(jù)源
用于 SQL Server 的 Microsoft OLE DB 提供程序???? SQL Server 實例
用于 Jet 的 Microsoft OLE DB 提供程序???????????? mdb 數(shù)據(jù)庫文件的路徑名
用于 ODBC 的 Microsoft OLE DB 提供程序?????????? 指向某個具體數(shù)據(jù)庫的 ODBC 數(shù)據(jù)源名稱
用于 oracle 的 Microsoft OLE DB 提供程序???????? 指向 oracle 數(shù)據(jù)庫的 SQL*Net 別名
用于索引服務(wù)的 Microsoft OLE DB 提供程序???????? 能夠?qū)ζ鋱?zhí)行屬性搜索或全文檢索的內(nèi)容文件
說明?? SQL Server 只針對分別用于 SQL Server、Jet、Oracle、索引服務(wù)和 ODBC 的 Microsoft OLE DB 提供程序進行了測試。然而,SQL Server 分布式查詢旨在與任何實現(xiàn)了必需的 OLE DB 接口的 OLE DB 提供程序一起使用。
為了使數(shù)據(jù)源能夠通過鏈接服務(wù)器返回數(shù)據(jù),那個數(shù)據(jù)源的 OLE DB 提供程序 (DLL) 必須位于 SQL Server 所在的服務(wù)器上。
鏈接服務(wù)器一般用來處理分布式查詢。當客戶端應(yīng)用程序通過鏈接服務(wù)器執(zhí)行分布式查詢時,SQL Server 將分析該命令,并向 OLE DB 發(fā)送行集請求。行集請求的形式可以是對提供程序執(zhí)行查詢或從提供程序打開基表。
管理鏈接服務(wù)器的定義
設(shè)置鏈接服務(wù)器時,請注冊 SQL Server 的連接信息和數(shù)據(jù)源信息。完成注冊后,該數(shù)據(jù)源總可以用單個邏輯名稱(即實例名)引用。
可以使用存儲過程或 SQL Server 企業(yè)管理器來創(chuàng)建或刪除鏈接服務(wù)器的定義。
使用存儲過程:
使用 sp_addlinkedserver 創(chuàng)建鏈接服務(wù)器的定義。若要查看有關(guān)給定的 SQL Server 實例中定義的鏈接服務(wù)器的信息,請使用 sp_linkedservers。有關(guān)更多信息,請參見 sp_addlinkedserver 和 sp_linkedservers。
使用 sp_dropserver 刪除鏈接服務(wù)器的定義。還可以使用此存儲過程刪除遠程服務(wù)器。
使用 SQL Server 企業(yè)管理器:
使用 SQL Server 企業(yè)管理器控制臺樹和"鏈接服務(wù)器"節(jié)點(在"安全性"文件夾內(nèi))來創(chuàng)建鏈接服務(wù)器的定義。為鏈接服務(wù)器定義名稱、提供程序?qū)傩?、服?wù)器選項和安全選項。有關(guān)各種為不同的 OLE DB 數(shù)據(jù)源設(shè)置鏈接服務(wù)器的方式以及要使用的參數(shù)值的更多信息,請參見 sp_addlinkedserver。
通過右擊鏈接服務(wù)器并單擊"屬性"命令,可編輯鏈接服務(wù)器的定義。
通過右擊鏈接服務(wù)器并單擊"刪除"命令,可刪除鏈接服務(wù)器的定義。
當對鏈接服務(wù)器執(zhí)行分布式查詢時,請對每個要查詢的數(shù)據(jù)源指定完全合法的、由四部分組成的表名。這個由四部分組成的名稱的格式應(yīng)是:linked_server_name.catalog.schema.object_name。
?? 眾所周知,在大型的數(shù)據(jù)庫系統(tǒng)設(shè)計中,為了提升效率,不可避免的要將不用的業(yè)務(wù)放在不同的數(shù)據(jù)實例上,因此我們使用到了鏈接服務(wù)器,鏈接服務(wù)器為大家在不同的服務(wù)之間進行分布式數(shù)據(jù)操作提供了便利。本例子基于windows 2003操作系統(tǒng),Sql server 2000(sp4)數(shù)據(jù)庫。
首先要打開你本地服務(wù)器和遠程服務(wù)器的MSDTC:
開始-->Microsoft SQL Server-->服務(wù)管理器-->選擇服務(wù)中的 Distributed Transaction Coordinator(此即DTC),點擊“啟動”按鈕,啟動MSDTC.
打開以后,在本地服務(wù)器上注冊遠程服務(wù)器的信息,創(chuàng)建linkedServer,操作代碼如下:
exec?? sp_addlinkedserver???? 'Far_MDB','','SQLOLEDB','YOIIO005','','','MDB'
然后使用sp_linkedservers,查看此服務(wù)器是否已經(jīng)成功注冊為鏈接服務(wù)器,如果已經(jīng)注冊成功,則使用
sp_addlinkedsrvlogin?? 'Far_MDB','false',null,'sa','****',注冊login帳號,然后你就可以執(zhí)行一個Sql語句,試試看看是否可以從鏈接服務(wù)器中操作數(shù)據(jù)了,
例如:
SELECT *
FROM OPENQUERY(Far_MDB, 'SELECT * FROM MDB_Member')
這就是從我的鏈接服務(wù)器當中去查詢MDB_Member表的數(shù)據(jù)
備注:
1、關(guān)于鏈接服務(wù)器的詳細情況請參閱聯(lián)機叢書中的sp_addlinkedserver、 sp_addlinkedsrvlogin、sp_addserver、sp_dropserver、sp_serveroption、sp_linkedservers等系統(tǒng)級存儲過程。
2、關(guān)于此鏈接服務(wù)器的創(chuàng)建及其使用在不同環(huán)境下(全部內(nèi)網(wǎng)服務(wù)器、一內(nèi)網(wǎng)一公網(wǎng)服務(wù)器、全公網(wǎng)服務(wù)器)測試,均告通過。
3、有時候在存儲過程中訪問鏈接服務(wù)器的時候可能會碰到如下的提示,必須要對ANSI warning 和ANSI nulls進行設(shè)置,這時候按照如下的方法進行設(shè)置:
設(shè)置本地數(shù)據(jù)庫的屬性-->連接-->選上ANSI warning 和 ANSI nulls
如何訪問SQL Server數(shù)據(jù)庫
無論是從桌面Windows電腦上還是在Pocket PC設(shè)備上訪問SQL Server數(shù)據(jù)庫,首先都需要建立數(shù)據(jù)庫連接。使用Visual Studio 2005開發(fā)桌面Windows應(yīng)用時,開發(fā)人員可以從服務(wù)器資源管理器中拖拉數(shù)據(jù)表到窗體上,但是.NET Compact Framework不支持數(shù)據(jù)設(shè)計器。這意味著開發(fā)人員需要編程實現(xiàn)建立數(shù)據(jù)庫連接。.NET Compact Framework的System.Data.SqlClient命名空間同樣不支持跨服務(wù)器的事務(wù)和連接池。設(shè)計移動應(yīng)用解決方案時,應(yīng)該將數(shù)據(jù)庫事務(wù)限制發(fā)生在服務(wù)器上的單獨數(shù)據(jù)庫中。
因為.NET Compact Framework的System.Data.SqlClient命名空間不支持數(shù)據(jù)庫連接池,所以在Pocket PC設(shè)備上建立SQL Server數(shù)據(jù)庫連接時會產(chǎn)生一定的延時。在桌面Windows編程中,要求盡可能縮短保持與數(shù)據(jù)庫連接的時間以及減少數(shù)據(jù)庫連接次數(shù)。而在開發(fā)Pocket PC上的數(shù)據(jù)庫應(yīng)用程序時,最佳策略是提前創(chuàng)建數(shù)據(jù)庫連接,并盡量在整個應(yīng)用程序生命周期內(nèi)保持數(shù)據(jù)庫連接來減少連接次數(shù)。
下面通過設(shè)計開發(fā)一個用途廣泛的Pocket PC數(shù)據(jù)庫應(yīng)用程序,介紹如何訪問服務(wù)器端數(shù)據(jù)。這個Pocket PC應(yīng)用程序需要引用System.Data.Common、System.Xml和System.Data.SqlClient命名空間。
如何用sql語句進行跨庫查詢
在機器B上的數(shù)據(jù)庫database2中創(chuàng)建一個臨時表#tmp,
內(nèi)容就是機器A上的數(shù)據(jù)庫database1里面的Table1。
如何用sql語句完成?(不借用dts等)
SQL code --創(chuàng)建鏈接服務(wù)器
exec sp_addlinkedserver?? 'ITSV','','SQLOLEDB','遠程服務(wù)器名或ip地址'
exec sp_addlinkedsrvlogin 'ITSV','false',null,'用戶名','密碼'
--查詢示例
select * from ITSV.數(shù)據(jù)庫名.dbo.表名
--導(dǎo)入示例
select * into 表 from ITSV.數(shù)據(jù)庫名.dbo.表名
--以后不再使用時刪除鏈接服務(wù)器
exec sp_dropserver 'ITSV','droplogins'
--連接遠程/局域網(wǎng)數(shù)據(jù)(openrowset/openquery/opendatasource)
--1、openrowset
--查詢示例
select * from openrowset('SQLOLEDB','sql服務(wù)器名';'用戶名';'密碼',數(shù)據(jù)庫名.dbo.表名)
--生成本地表
select * into 表 from openrowset('SQLOLEDB','sql服務(wù)器名';'用戶名';'密碼',數(shù)據(jù)庫名.dbo.表名)
--把本地表導(dǎo)入遠程表
insert openrowset('SQLOLEDB','sql服務(wù)器名';'用戶名';'密碼',數(shù)據(jù)庫名.dbo.表名)
select *from 本地表
--更新本地表
update b
set b.列A=a.列A
from openrowset('SQLOLEDB','sql服務(wù)器名';'用戶名';'密碼',數(shù)據(jù)庫名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1
--openquery用法需要創(chuàng)建一個連接
--首先創(chuàng)建一個連接創(chuàng)建鏈接服務(wù)器
exec sp_addlinkedserver?? 'ITSV','','SQLOLEDB','遠程服務(wù)器名或ip地址'
--查詢
select *
FROM openquery(ITSV, 'SELECT *?? FROM 數(shù)據(jù)庫.dbo.表名')
--把本地表導(dǎo)入遠程表
insert openquery(ITSV, 'SELECT *?? FROM 數(shù)據(jù)庫.dbo.表名')
select * from 本地表
--更新本地表
update b
set b.列B=a.列B
FROM openquery(ITSV, 'SELECT * FROM 數(shù)據(jù)庫.dbo.表名') as a
inner join 本地表 b on a.列A=b.列A
--3、opendatasource/openrowset
SELECT *
FROM opendatasource('SQLOLEDB', 'Data Source=ip/ServerName;User ID=登陸名password=密碼' ).test.dbo.roy_ta
--把本地表導(dǎo)入遠程表
insert opendatasource('SQLOLEDB', 'Data Source=ip/ServerName;User ID=登陸名password=密碼').數(shù)據(jù)庫.dbo.表名
select * from 本地表
用 鏈接服務(wù)器
OPENROWSET
OPENDATASOURCE
都可以
鏈接服務(wù)器.database1.dbo.table1
鏈接服務(wù)器.database1.dbo.table1
SQL code
select * into #
from openrowset('sqloledb','ip';'sa';'','select * from pubs.dbo.jobs')
如果只是偶爾使用 就用opendatasource/openrowset 固定的頻繁使用建linked server
?
轉(zhuǎn)自: http://www.cnblogs.com/railgunman/archive/2010/12/25/1916780.html
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
