SQL Server不同服務器不同數據庫間的操作


什么是跨服務器操作?

跨服務器操作就是可以在本地連接到遠程服務器上的數據庫,可以在對方的數據庫上進行相關的數據庫操作,比如增刪改查。

為什么要進行跨服務器操作

隨着數據量的增多,業務量的擴張,需要在不同的服務器安裝不同的數據庫,有時候因為業務需要,將不同的服務器中的數據進行整合,這時候就需要進行跨服務器操作了。

跨服務器操作的工具是什么?

DBLINK(數據庫鏈接),顧名思義就是數據庫的鏈接,就像電話線一樣,是一個通道,當我們要跨本地數據庫,訪問另外一個數據庫表中的數據時,本地數據庫中就必須要創建遠程數據庫的dblink,通過dblink本地數據庫可以像訪問本地數據庫一樣訪問遠程數據庫表中的數據。

一、不同服務器不同數據庫:

圖形創建SQL Server遠程鏈接:

1. 登錄到本地數據庫-->服務器對象-->鏈接服務器(右鍵)-->新建鏈接服務器

2. 在彈出的對話框中輸入相關信息

3. 點擊左側“安全性”,出現以下頁面,輸入對方數據庫的賬號密碼即可

4. 點擊“確定”后即創建成功,如下圖可以看到創建好的鏈接服務器

5. 下面使用創建好的鏈接試着查詢對方服務器的表來驗證一下

原文地址:http://baijiahao.baidu.com/s?id=1601340639397887562&wfr=spider&for=pc

代碼創建SQL Server遠程鏈接:

1. 創建鏈接服務器

1.1 創建一個鏈接名

exec sp_addlinkedserver 'LinkName', '', 'SQLOLEDB', '遠程服務器名或ip地址'   --有自定義實例名還要加上"/實例名" /*例如:exec sp_addlinkedserver 'TonyLink', '', 'SQLOLEDB', '192.168.2.110' */  

1.2 創建登錄信息(或叫創建鏈接服務器登錄名映射)(只需選擇一種方式)

1.2.1 以windows認證的方式登錄

exec sp_addlinkedsrvlogin 'LinkName'  --或exec sp_addlinkedsrvlogin 'LinkName', 'true'

 /*例如:exec sp_addlinkedsrvlogin 'TonyLink' */  

1.2.2 以SQL認證的方式登錄                                                                    

exec sp_addlinkedsrvlogin 'LinkName', 'false', NULL, '用戶名', '密碼'

/*例如:exec sp_addlinkedsrvlogin 'TonyLink', 'false', null, 'sa', '123456' */

 

2. 鏈接服務器相關數據操作

2.1 查詢

select * from LinkName.數據庫名.架構名.表名 /*例如:select * from TonyLink.LoadData.dbo.XimaArea */

2.2 把遠程數據庫查詢的數據新增導入到本地表(本地表不需要提前存在,會自動創建)

select  * into 表名 from LinkName.數據庫名.架構名.表名 /*例如:select * into Newtb fromTonyLink.LoadData.dbo.XimaArea */

2.3 更新

update LinkName.數據庫名.架構名.表名 set 字段='' where 字段='條件'

/*例如:update TonyLink.LoadData.dbo.XimaArea set area='中華區' where areaid=8 */

2.4 刪除

delete LinkName.數據庫名.架構名.表名 where 字段名='條件'

/*例如:delete TonyLink.LoadData.dbo.XimaArea where areaid=1 */

不再使用時刪除鏈接服務器

exec sp_dropserver 'LinkName', 'droplogins'

3. 通過行集函數(openquery/openrowset/opendatasource)操作方法

3.1 openquery 方法(需要借助剛創建的鏈接服務器):

3.1.1 查詢

select * from openquery(linkname, 'select * from 數據庫名.架構名.表名') /* 例如:select * from openquery(TonyLink, 'select * from LoadData.dbo.XimaArea') */

3.1.2 導入

3.1.2.1 把本地表(本地表需要提前存在)導入到遠程表(兩表之間列要對應)
insert openquery(linkname, 'select * from 數據庫名.架構名.表名') select * from 本地表 /* 例如:insert openquery(TonyLink, 'select area from LoadData.dbo.XimaArea') select area from ttt */
3.1.2.2 把本地表(本地表需要提前存在)指定列導入遠程表(兩表之間列要對應)
insert openquery(linkname, 'select * from 數據庫名.架構名.表名') (列, 列...) select 列, 列... from 本地表 /* 例如:insert openquery(TonyLink,'select * from LoadData.dbo.ximajxs')(jxsName, consignee, address)     select jxsName, consignee, address from ttt */

3.1.3 更新

update openquery(linkname, 'select * from 數據庫名.架構名.表名') set 字段='' where 字段='條件'

/*例如:update openquery(TonyLink, 'select * from LoadData.dbo.ximajxs') set JxsName='北京有限公司' where jxsId=10 */

3.1.4 刪除

delete openquery(linkname, 'select * from 數據庫名.架構名.表名') where 字段名='條件'

/*例如:delete openquery(TonyLink, 'select * from LoadData.dbo.ximajxs') where jxsId=10 */

3.2 openrowset:

3.2.1 查詢

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

報錯問題:

解決方法:

在數據庫服務實例名(如圖1-3,GP-PC\sql2008位置)點擊鼠標右鍵【方面】,在窗口【查看方面】— 點擊【常規】— 【方面】— 選擇【外圍應用配置器】,找到【AdHocRemoteQueriesEnabled】— 選擇【True】— 點擊【確定】

3.2.2 生成本地表

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

3.2.3 把本地表導入到遠程表

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

3.2.4 更新本地表

update b set b.address = a.area from openrowset('SQLOLEDB', '192.168.2.110'; 'sa'; '123456', LoadData.dbo.XimaArea) as a inner join ttt b on a.areaid=b.areaid

3.3 opendatasource

3.3.1  查詢

select * from opendatasource('SQLOLEDB', 'Data Source=192.168.2.110; uid=sa; pwd=123456').LoadData.dbo.XimaArea

 4. 具體例子

if exists(select 1 from master.dbo.sysservers where srvname='linktest') begin
    exec sys.sp_droplinkedsrvlogin 'linktest', 'sa'
    exec sys.sp_dropserver 'linktest'
end

exec sys.sp_addlinkedserver @server = 'linktest', -- sysname
    @srvproduct = N'', -- nvarchar(128)
    @provider = N'SQLOLEDB', -- nvarchar(128)
    @datasrc = N'192.168.2.110' -- nvarchar(4000)

exec sys.sp_addlinkedsrvlogin @rmtsrvname = 'linktest', -- sysname
    @useself = 'false', -- varchar(8)
    @locallogin = null, -- sysname
    @rmtuser = 'sa', -- sysname
    @rmtpassword = '123456' -- sysname

select * from linktest.LoadData.dbo.ximalss if exists(select 1 from master.dbo.sysservers where srvname='linktest') begin
    exec sys.sp_droplinkedsrvlogin 'linktest', 'sa'
    exec sys.sp_dropserver 'linktest'
end

go

參考鏈接:https://www.cnblogs.com/w-y-f/archive/2012/05/07/2488474.html

二、同一台服務器不同數據庫

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

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM