在使用分布式結構的系統時,我們常常會遇到跨庫查詢的問題,跨庫查詢一般使用以下方法
1. openrowset
例子:
select * from openrowset('SQLOLEDB','sql服務器名';'用戶名';'密碼',數據庫名.dbo.表名)
只有在以下情況下才能使用 OPENROWSET 訪問 OLE DB 數據源中的遠程數據:
指定訪問接口的 DisallowAdhocAccess 注冊表選項已顯式設置為 0,並啟用了 Ad Hoc Distributed Queries 高級配置選項。如果未設置這些選項,則默認行為不允許即席訪問。
需要修改數據庫服務器的注冊表DisallowAdhocAccess 並通過sp_configure 修改Ad Hoc Distributed Queries高級配置選項為啟用
2.opendatasource
例子:
SELECT *
FROM opendatasource('SQLOLEDB', 'Data Source=ip/ServerName;User ID=登陸名; password=密碼' ).數據庫名.dbo.表名
同樣環境需要與1的配置一樣
3.openquery
例子:
--首先創建一個連接創建鏈接服務器
exec sp_addlinkedserver 'ITSV','','SQLOLEDB','遠程服務器名或ip地址'
--查詢
select *
FROM openquery(ITSV, 'SELECT * FROM 數據庫.dbo.表名')
--把本地表導入遠程表
insert openquery(ITSV, 'SELECT * FROM 數據庫.dbo.表名')
select * from 本地表
4. sp_addlinkedserver
sp_addlinkedsrvlogin
例子:
exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','遠程服務器名或ip地址'
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'用戶名','密碼'
建立好連接后,就可以查詢了
--查詢示例
select * from srv_lnk.數據庫名.dbo.表名
--導入示例
select * into 表 from srv_lnk.數據庫名.dbo.表名
這個連接在建立好后會一直存在,如果不想用了,可以通過以下語句刪除
exec sp_dropserver 'srv_lnk','droplogins'
推薦使用的是方法4,在代碼中,也推薦使用方法4的連接方式,出於效率和安全行而已。