Sql Server 跨服務器鏈接

用openrowset鏈接遠程SQL或插入數據sql

--若是隻是臨時訪問,能夠直接用openrowset數據庫

--查詢示例編程

select * from openrowset('SQLOLEDB', 'sql服務器名'; '用戶名'; '密碼', 數據庫名.dbo.表名)windows

--導入示例安全

select * into 表 from openrowset('SQLOLEDB' ,'sql服務器名';'用戶名';'密碼' ,數據庫名.dbo.表名)服務器

--建立連接服務器網絡

exec sp_addlinkedserver   'srv_lnk', '', 'SQLOLEDB','遠程服務器名或ip地址'oracle

exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'用戶名','密碼'分佈式

go測試

--查詢示例

select * from srv_lnk.數據庫名.dbo.表名

--導入示例

select * into 表 from srv_lnk.數據庫名.dbo.表名

--之後再也不使用時刪除連接服務器

exec sp_dropserver 'srv_lnk','droplogins'

go

--下面的示例訪問來自某個表的數據,該表在 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

因爲項目須要,在開發過程趕上跨數據庫服務器訪問數據的問題.

在網絡上一搜,資料確實很多,不過解決本身的問題也花了大半天的時候,在這裏花些時間總結一下.

1.確立問題

因爲須要進行跨數據庫服務器的查詢操做,因此我我的把其定位於分佈式查詢數據的問題.

2.解決方案

第一個概念.連接服務器.

連接服務器通常用來處理分佈式查詢。當客戶端應用程序經過連接服務器執行分佈式查詢時,SQL Server 將分析該命令,並向 OLE DB 發送行集請求。行集請求的形式能夠是對提供程序執行查詢或從提供程序打開基表。

分佈式查詢能夠訪問來自多種異類數據源的數據,而這些數據可存儲在相同或不一樣的計算機上。Microsoft® SQL Server? 2000 經過使用 OLE DB(Microsoft 通用數據訪問應用程序接口 (API) 規範)支持分佈式查詢。

連接服務器配置容許 Microsoft® SQL Server? 對其它服務器上的 OLE DB 數據源執行命令。連接服務器具備如下優勢:

遠程服務器訪問。

對整個企業內的異類數據源執行分佈式查詢、更新、命令和事務的能力。

可以以類似的方式肯定不一樣的數據源。

連接服務器組件

連接服務器的定義指定了 OLE DB 提供程序和 OLE DB 數據源。

OLE DB 提供程序是管理特定數據源和與特定數據源進行交互的動態連接庫 (DLL)。OLE DB 數據源標識可經過 OLE DB 訪問的特定數據庫。儘管經過連接服務器的定義所查詢的數據源一般是數據庫,但也存在適用於多種文件和文件格式的 OLE DB 提供程序,包括文本文件、電子表格數據和全文內容檢索結果。下表說明了最經常使用於 SQL Server 的 OLE DB 提供程序和數據源示例。

OLE DB提供程序                                 OLE DB 數據源

用於 SQL Server 的 Microsoft OLE DB 提供程序     SQL Server 實例

用於 Jet 的 Microsoft OLE DB 提供程序             mdb 數據庫文件的路徑名

用於 ODBC 的 Microsoft OLE DB 提供程序           指向某個具體數據庫的 ODBC 數據源名稱

用於 oracle 的 Microsoft OLE DB 提供程序         指向 oracle 數據庫的 SQL*Net 別名

用於索引服務的 Microsoft OLE DB 提供程序         可以對其執行屬性搜索或全文檢索的內容文件

說明   SQL Server 只針對分別用於 SQL Server、Jet、Oracle、索引服務和 ODBC 的 Microsoft OLE DB 提供程序進行了測試。然而,SQL Server 分佈式查詢旨在與任何實現了必需的 OLE DB 接口的 OLE DB 提供程序一塊兒使用。

爲了使數據源可以經過連接服務器返回數據,那個數據源的 OLE DB 提供程序 (DLL) 必須位於 SQL Server 所在的服務器上。

連接服務器通常用來處理分佈式查詢。當客戶端應用程序經過連接服務器執行分佈式查詢時,SQL Server 將分析該命令,並向 OLE DB 發送行集請求。行集請求的形式能夠是對提供程序執行查詢或從提供程序打開基表。

管理連接服務器的定義

設置連接服務器時,請註冊 SQL Server 的鏈接信息和數據源信息。完成註冊後,該數據源總能夠用單個邏輯名稱(即實例名)引用。

可使用存儲過程或 SQL Server 企業管理器來建立或刪除連接服務器的定義。

使用存儲過程:

使用 sp_addlinkedserver 建立連接服務器的定義。若要查看有關給定的 SQL Server 實例中定義的連接服務器的信息,請使用 sp_linkedservers。有關更多信息,請參見 sp_addlinkedserver 和 sp_linkedservers。

使用 sp_dropserver 刪除連接服務器的定義。還可使用此存儲過程刪除遠程服務器。

使用 SQL Server 企業管理器:

使用 SQL Server 企業管理器控制檯樹和"連接服務器"節點(在"安全性"文件夾內)來建立連接服務器的定義。爲連接服務器定義名稱、提供程序屬性、服務器選項和安全選項。有關各類爲不一樣的 OLE DB 數據源設置連接服務器的方式以及要使用的參數值的更多信息,請參見 sp_addlinkedserver。

經過右擊連接服務器並單擊"屬性"命令,可編輯連接服務器的定義。

經過右擊連接服務器並單擊"刪除"命令,可刪除連接服務器的定義。

當對連接服務器執行分佈式查詢時,請對每一個要查詢的數據源指定徹底合法的、由四部分組成的表名。這個由四部分組成的名稱的格式應是:linked_server_name.catalog.schema.object_name。

   衆所周知,在大型的數據庫系統設計中,爲了提高效率,不可避免的要將不用的業務放在不一樣的數據實例上,所以咱們使用到了連接服務器,連接服務器爲你們在不一樣的服務之間進行分佈式數據操做提供了便利。本例子基於windows 2003操做系統,Sql server 2000(sp4)數據庫。

首先要打開你本地服務器和遠程服務器的MSDTC:

開始-->Microsoft SQL Server-->服務管理器-->選擇服務中的 Distributed Transaction Coordinator(此即DTC),點擊「啓動」按鈕,啓動MSDTC.

打開之後,在本地服務器上註冊遠程服務器的信息,建立linkedServer,操做代碼以下:

exec   sp_addlinkedserver     'Far_MDB','','SQLOLEDB','YOIIO005','','','MDB'

而後使用sp_linkedservers,查看此服務器是否已經成功註冊爲連接服務器,若是已經註冊成功,則使用

sp_addlinkedsrvlogin   'Far_MDB','false',null,'sa','****',註冊login賬號,而後你就能夠執行一個Sql語句,試試看看是否能夠從連接服務器中操做數據了,

例如:

SELECT *

FROM OPENQUERY(Far_MDB, 'SELECT * FROM MDB_Member')

這就是從個人連接服務器當中去查詢MDB_Member表的數據

備註:

一、關於連接服務器的詳細狀況請參閱聯機叢書中的sp_addlinkedserver、 sp_addlinkedsrvlogin、sp_addserver、sp_dropserver、sp_serveroption、sp_linkedservers等系統級存儲過程。

二、關於此連接服務器的建立及其使用在不一樣環境下(所有內網服務器、一內網一公網服務器、全公網服務器)測試,均告經過。

三、有時候在存儲過程當中訪問連接服務器的時候可能會碰到以下的提示,必需要對ANSI warning 和ANSI nulls進行設置,這時候按照以下的方法進行設置:

設置本地數據庫的屬性-->鏈接-->選上ANSI warning 和 ANSI nulls

如何訪問SQL Server數據庫

不管是從桌面Windows電腦上仍是在Pocket PC設備上訪問SQL Server數據庫,首先都須要創建數據庫鏈接。使用Visual Studio 2005開發桌面Windows應用時,開發人員能夠從服務器資源管理器中拖拉數據表到窗體上,可是.NET Compact Framework不支持數據設計器。這意味着開發人員須要編程實現創建數據庫鏈接。.NET Compact Framework的System.Data.SqlClient命名空間一樣不支持跨服務器的事務和鏈接池。設計移動應用解決方案時,應該將數據庫事務限制發生在服務器上的單獨數據庫中。

由於.NET Compact Framework的System.Data.SqlClient命名空間不支持數據庫鏈接池,因此在Pocket PC設備上創建SQL Server數據庫鏈接時會產生必定的延時。在桌面Windows編程中,要求儘量縮短保持與數據庫鏈接的時間以及減小數據庫鏈接次數。而在開發Pocket PC上的數據庫應用程序時,最佳策略是提早建立數據庫鏈接,並儘可能在整個應用程序生命週期內保持數據庫鏈接來減小鏈接次數。

下面經過設計開發一個用途普遍的Pocket PC數據庫應用程序,介紹如何訪問服務器端數據。這個Pocket PC應用程序須要引用System.Data.Common、System.Xml和System.Data.SqlClient命名空間。

如何用sql語句進行跨庫查詢

在機器B上的數據庫database2中建立一個臨時表#tmp,

內容就是機器A上的數據庫database1裏面的Table1。

如何用sql語句完成?(不借用dts等)

SQL code --建立連接服務器

exec sp_addlinkedserver   'ITSV','','SQLOLEDB','遠程服務器名或ip地址'

exec sp_addlinkedsrvlogin 'ITSV','false',null,'用戶名','密碼'

--查詢示例

select * from ITSV.數據庫名.dbo.表名

--導入示例

select * into 表 from ITSV.數據庫名.dbo.表名

--之後再也不使用時刪除連接服務器

exec sp_dropserver 'ITSV','droplogins'

--鏈接遠程/局域網數據(openrowset/openquery/opendatasource)

--一、openrowset

--查詢示例

select * from openrowset('SQLOLEDB','sql服務器名';'用戶名';'密碼',數據庫名.dbo.表名)

--生成本地表

select * into 表 from openrowset('SQLOLEDB','sql服務器名';'用戶名';'密碼',數據庫名.dbo.表名)

--把本地表導入遠程表

insert openrowset('SQLOLEDB','sql服務器名';'用戶名';'密碼',數據庫名.dbo.表名)

select *from 本地表

--更新本地表

update b

set b.列A=a.列A

from openrowset('SQLOLEDB','sql服務器名';'用戶名';'密碼',數據庫名.dbo.表名)as a inner join 本地表 b

on a.column1=b.column1

--openquery用法須要建立一個鏈接

--首先建立一個鏈接建立連接服務器

exec sp_addlinkedserver   'ITSV','','SQLOLEDB','遠程服務器名或ip地址'

--查詢

select *

FROM openquery(ITSV, 'SELECT *   FROM 數據庫.dbo.表名')

--把本地表導入遠程表

insert openquery(ITSV, 'SELECT *   FROM 數據庫.dbo.表名')

select * from 本地表

--更新本地表

update b

set b.列B=a.列B

FROM openquery(ITSV, 'SELECT * FROM 數據庫.dbo.表名') as a

inner join 本地表 b on a.列A=b.列A

--三、opendatasource/openrowset

SELECT *

FROM opendatasource('SQLOLEDB', 'Data Source=ip/ServerName;User ID=登錄名password=密碼' ).test.dbo.roy_ta

--把本地表導入遠程表

insert opendatasource('SQLOLEDB', 'Data Source=ip/ServerName;User ID=登錄名password=密碼').數據庫.dbo.表名

select * from 本地表

用 連接服務器

OPENROWSET

OPENDATASOURCE

均可以

連接服務器.database1.dbo.table1

連接服務器.database1.dbo.table1

SQL code

select * into #

from openrowset('sqloledb','ip';'sa';'','select * from pubs.dbo.jobs')

若是隻是偶爾使用 就用opendatasource/openrowset 固定的頻繁使用建linked server

相關文章
相關標籤/搜索