什么是跨服務器操作?
跨服務器操作就是可以在本地連接到遠程服務器上的數據庫,可以在對方的數據庫上進行相關的數據庫操作,比如增刪改查。
為什么要進行跨服務器操作
隨着數據量的增多,業務量的擴張,需要在不同的服務器安裝不同的數據庫,有時候因為業務需要,將不同的服務器中的數據進行整合,這時候就需要進行跨服務器操作了。
跨服務器操作的工具是什么?
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.表名
