摘 要:在存儲(chǔ)過程調(diào)用不同數(shù)據(jù)庫(kù)的數(shù)據(jù)該如何做,,比如在存儲(chǔ)過程名為AAA的存儲(chǔ)過程里面調(diào)用數(shù)據(jù)庫(kù)為hudu1,,hudu2,hudu3里面的數(shù)據(jù)來(lái)統(tǒng)計(jì)?
正 文:
在同一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器上:
select * from hudu1.dbo.表名
select * from hudu2.dbo.表名
select * from hudu3.dbo.表名
在不同數(shù)據(jù)庫(kù)服務(wù)器上:
select * from openrowset('SQLOLEDB','sql服務(wù)器1';'用戶名';'密碼',hudu1.dbo.表名)
select * from openrowset('SQLOLEDB','sql服務(wù)器2';'用戶名';'密碼',hudu2.dbo.表名)
select * from openrowset('SQLOLEDB','sql服務(wù)器3';'用戶名';'密碼',hudu3.dbo.表名)
下面的方法可以參考:
方法一:用OPENDATASOURCE 方法去操作異地?cái)?shù)據(jù)庫(kù)
declare @i int
set @i=1
select * from OPENDATASOURCE('SQLOLEDB','Data Source=IP地址;User ID=sa;Password=密碼').異地?cái)?shù)據(jù)庫(kù)名.dbo.表名 A inner join 本地?cái)?shù)據(jù)庫(kù)名..表名 B
on A.關(guān)聯(lián)字段=B.關(guān)聯(lián)字段 and A.字段名稱=@i
--方法二:如果經(jīng)常訪問或數(shù)據(jù)量大,建議用鏈接服務(wù)器
--創(chuàng)建鏈接服務(wù)器
exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','遠(yuǎn)程服務(wù)器名或ip地址'
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'用戶名','密碼'
go
--查詢示例
select * from srv_lnk.數(shù)據(jù)庫(kù)名.dbo.表名
--導(dǎo)入示例
select * into 表 from srv_lnk.數(shù)據(jù)庫(kù)名.dbo.表名
go
--以后不再使用時(shí)刪除鏈接服務(wù)器
exec sp_dropserver 'srv_lnk','droplogins'
--如果只是臨時(shí)訪問,可以直接用openrowset
--查詢示例
select * from openrowset('SQLOLEDB'
,'sql服務(wù)器名';'用戶名';'密碼'
,數(shù)據(jù)庫(kù)名.dbo.表名)
--導(dǎo)入示例
select * into 表 from openrowset('SQLOLEDB'
,'sql服務(wù)器名';'用戶名';'密碼'
,數(shù)據(jù)庫(kù)名.dbo.表名)
錯(cuò)誤7405:異類查詢要求為連接設(shè)置ANSI-NULL和ANSI-WARNNINGS選項(xiàng),,這將確保一致的查詢語(yǔ)意,,請(qǐng)啟用這些選項(xiàng),然后重新發(fā)出查詢
解決方法:
SET ANSI_NULLS ON
SET ANSI_WARNINGS ON
GO
Create PROCEDURE ....
SQL SERVER存儲(chǔ)過程中通過鏈接服務(wù)器訪問遠(yuǎn)程服務(wù)器SQL實(shí)戰(zhàn)
SQLSERVER的開發(fā)中,,經(jīng)常會(huì)碰到跨物理服務(wù)器跨數(shù)據(jù)庫(kù)的訪問和操作,。
下面來(lái)分析下在存儲(chǔ)過程中創(chuàng)建遠(yuǎn)程訪問的完整例子.
需求: 在A服務(wù)器上有Card數(shù)據(jù)庫(kù),Card數(shù)據(jù)庫(kù)有存儲(chǔ)過程proc_Card;
在B服務(wù)器上有AccountDB數(shù)據(jù)庫(kù),AccountDB下有Up_account存儲(chǔ)過程。
現(xiàn)在需要在執(zhí)行proc_Card最后,,調(diào)用一次Up_account存儲(chǔ)過程,,以實(shí)現(xiàn)不同服,不同數(shù)據(jù)庫(kù)的數(shù)據(jù)同步.
分析: 1. 存儲(chǔ)過程中調(diào)用存儲(chǔ)過程不是問題,
Execute '存儲(chǔ)過程名字'
存儲(chǔ)過程參數(shù)1=參數(shù)1的值,
參數(shù)2=參數(shù)2的值
......
2. 如何在A服上創(chuàng)建對(duì)B服務(wù)器 SQLSERVER的訪問呢?
首先不得不提的是SQLSERVER鏈接服務(wù)器,在sql 2K中 企業(yè)管理器===>安全性===>鏈接服務(wù)器.
SQLSERVER2005 or 2008中 Maragement studio 服務(wù)器對(duì)象==>鏈接服務(wù)器,。
這個(gè)鏈接服務(wù)器對(duì)象是如何來(lái)的?
默認(rèn)情況下會(huì)只有本機(jī)一個(gè),,鏈接服務(wù)器名就是本機(jī)機(jī)器名,通過系統(tǒng)存儲(chǔ)過程Execute sp_helpserver 可以查看,顯示為name字段
如何新增鏈接服務(wù)器 ?
A. 通過向?qū)В?br>
1. 右鍵鏈接服務(wù)器--->新增鏈接服務(wù)器
2. 輸入鏈接服務(wù)器名[ 需要訪問的服務(wù)器的機(jī)器名或是IP,,如果別名無(wú)法解析到,,則使用IP ] ,指定服務(wù)器類型為SQL SERVER,
3. 在安全性中選擇'使用此安全上下文建立連接' 指定需要訪問的服務(wù)器的SQL 登錄賬號(hào)和密碼
4,。點(diǎn)確定,刷新鏈接服務(wù)器,,則可視配置的鏈接服務(wù)器信息
B. 通過系統(tǒng)存儲(chǔ)過程,
建立鏈接sql server服務(wù)器,通常有兩種情況:
1. 第一種情況,,產(chǎn)品選”sql server”
EXEC sp_addlinkedserver
@server='linkServerName',
@srvproduct = N'SQL Server'
這種情況,,@server (linkServerName)就是要鏈接的sqlserver服務(wù)器名或者ip地址,。
2.第二種情況,訪問接口選“Microsoft OLE DB Provider Sql Server”或“Sql Native Client”
EXEC sp_addlinkedserver
@server=' linkServerName ',
@srvproduct='',
@provider='SQLNCLI',
@datasrc='sqlServerName'
這種情況,,@datasrc(sqlServerName)就是要鏈接的實(shí)際sqlserver服務(wù)器名或者ip地址,。
3.Sql server數(shù)據(jù)庫(kù)引擎是通過上面設(shè)置的服務(wù)器名或者ip地址訪問鏈接服務(wù)器,DTC服務(wù)也是通過服務(wù)器名或者ip地址訪問鏈接服務(wù)器,,所以要保證數(shù)據(jù)庫(kù)引擎和DTC都能通過服務(wù)器名或者ip地址訪問到鏈接服務(wù)器,。
建立了鏈接,創(chuàng)建了數(shù)據(jù)庫(kù)的登錄訪問:
EXEC sp_addlinkedsrvlogin
'上面創(chuàng)建的鏈接服務(wù)器的別名或是IP', --被訪問的服務(wù)器別名
'false',
NULL,
'賬號(hào)', --賬號(hào)
'登錄密碼' --密碼
接下來(lái)就可以通過鏈接服務(wù)器來(lái)訪問服務(wù)器B的AccountDB庫(kù)下up_account存儲(chǔ)過程了:
Execute [鏈接服務(wù)器別名].庫(kù)名.dbo.存儲(chǔ)過程
工作似乎已經(jīng)結(jié)束了,但此時(shí)發(fā)現(xiàn),執(zhí)行存A服存儲(chǔ)過程時(shí)會(huì)報(bào) '未將[所用到的別名] 服務(wù)器配置為可用的RPC' ,如何解決?
很簡(jiǎn)單,查看鏈接服務(wù)器的選項(xiàng),將RPC RPC_Out 值由False 改為 TRUE 再調(diào)試,,成功!
也有情況在這里無(wú)法更改,解決方案是:
exec sp_configure 'show advanced options', 1; --默認(rèn)是0
GO
RECONFIGURE WITH OVERRIDE;
GO
存儲(chǔ)過程調(diào)用不同數(shù)據(jù)庫(kù)的數(shù)據(jù)_SQL SERVER存儲(chǔ)過程中通過鏈接服務(wù)器訪問遠(yuǎn)程服務(wù)器SQL實(shí)戰(zhàn)_SQLSERVER跨平臺(tái)數(shù)據(jù)訪問