存储过程调用不同数据库的数据

存储过程调用不同 数据库的数据
在存储过程调用不同数据库的数据该如何做,比如在存储过程名为AAA的存储过程里面调用数据库为hudu1,hudu2,hudu3里面的数据来统计? ITPUB个人空间+L7gd"E0[X9aZ
在同一台数据库 服务器上:
|8N;^"^UR'G4k&rS L0select * from hudu1.dbo.表名
Ty5JvB-?;k8l0select * from hudu2.dbo.表名 ITPUB个人空间X.?r*h ? m
select * from hudu3.dbo.表名 ITPUB个人空间w u8m,C)XG3D |~u

/mXzU!iCGw0在不同数据库服务器上:
c/XMA9JlnQ0select * from openrowset('SQLOLEDB','sql服务器1';'用户名';'密码',hudu1.dbo.表名) ITPUB个人空间\G ksR$n
select * from openrowset('SQLOLEDB','sql服务器2';'用户名';'密码',hudu2.dbo.表名)
O:`%Z-d&F"E5JX0select * from openrowset('SQLOLEDB','sql服务器3';'用户名';'密码',hudu3.dbo.表名)
下面的方法可以参考:
?Uj%q!?1h~*P7lF0方法一:用OPENDATASOURCE 方法去操作异地数据库 ITPUB个人空间mE0I/[ W
ITPUB个人空间~BW2ts\
declare @i int
P~jC vT)b0set @i=1 ITPUB个人空间Eal i)t0F\(~N
select * from OPENDATASOURCE('SQLOLEDB','Data Source=IP地址;User ID=sa;Password=密码').异地数据库名.dbo.表名 A inner join 本地数据库名..表名 B
/^f&w$O@i{kA `"@2b0on A.关联字段=B.关联字段 and A.字段名称 =@i ITPUB个人空间mVL#a)\EmV&R.s1B,X({
ITPUB个人空间 n3V.W@Vh$s k
ITPUB个人空间yIe3fd5|
ITPUB个人空间w'J6E h*u#c-i-K9l}a W
--方法二:如果经常访问或数据量大,建议用链接服务器
'j*[ezOTOir0
bLZ#`"u0y@6H0--创建链接服务器
6IsWKb%K0exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','远程服务器名或ip地址' ITPUB个人空间[3T*v!Ds2}Q[
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'用户名','密码' ITPUB个人空间 KzJG| G+L
go
U/O#i%JI(ba0 ITPUB个人空间,J*c;U(O+y7v~Q]\7M
--查询示例 ITPUB个人空间9A |(RLVDM
select * from srv_lnk.数据库名.dbo.表名
G-^4zZ*b`0 ITPUB个人空间 U#[ J P.D7K
--导入示例 ITPUB个人空间5CE6h Gu4u'_E(nM
select * into 表 from srv_lnk.数据库名.dbo.表名
i;f? _"T\}}0
_9NF Vpc0go ITPUB个人空间$_.x5K&X7R#|
--以后不再使用时删除链接服务器 ITPUB个人空间"T*Z0_+Zda/B6m:@
exec sp_dropserver 'srv_lnk','droplogins'
+W5IMK:Rx&r0
;Y3V O3Td0 ITPUB个人空间-\[} NG/t6~/H
--如果只是临时访问,可以直接用openrowset
B+|'U;w K1U'` Pr Y0@8Q0--查询示例
R*I ^n"vW8k u.d0select * from openrowset('SQLOLEDB' ITPUB个人空间}*f I)^%hF^B rc
,'sql服务器名';'用户名';'密码' ITPUB个人空间pf{};p+bJ no
,数据库名.dbo.表名) ITPUB个人空间0OmPqj0n%q(?
ITPUB个人空间#Z?h2Y V`r_

~/xPs x ErQ h0--导入示例
3{ uZa)A y Q H0select * into 表 from openrowset('SQLOLEDB' ITPUB个人空间NHs)\\^
,'sql服务器名';'用户名';'密码' ITPUB个人空间L"G5a{#ju
,数据库名.dbo.表名)
错误7405:异类查询要求为连接设置ANSI-NULL和ANSI-WARNNINGS选项,这将确保一致的查询语意,请启用这些选项,然后重新发出查询 ITPUB个人空间BLV/j2B+K0S
解决方法: ITPUB个人空间3BT;w7D Vc O^L#sco
SET ANSI_NULLS ON
(am$Fe5T6N l8{ A]0 SET ANSI_WARNINGS ON
i,Bn(CP:W'L[LI0 GO ITPUB个人空间^W#p4b1g%cW
CREATE PROCEDURE ....
SQL SERVER存储过程中通过链接服务器访问远程服务器SQL实战
SQLSERVER的开发中,经常会碰到跨物理服务器跨数据库的访问和操作。 ITPUB个人空间,v%@-` j)F fy,f
下面来分析下在存储过程中创建远程访问的完整例子.
? E Iov[v0需求: 在A服务器上有Card数据库,Card数据库有存储过程proc_Card;
,a:H"Zht |WZK0在B服务器上有AccountDB数据库,AccountDB下有Up_account存储过程。
i7a9x$VD8Z _5ntX7n0现在需要在执行proc_Card最后,调用一次Up_account存储过程,以实现不同服,不同数据库的数据同步. ITPUB个人空间uAWdW
分析: 1. 存储过程中调用存储过程不是问题,
Y$yir)|hh0 Execute '存储过程名字'
},wo+d{;Jh0 存储过程参数1=参数1的值, ITPUB个人空间_,Vy.LKby
参数2=参数2的值
UEf],GgB0 ......
mp p GU\0 2. 如何在A服上创建对B服务器 SQLSERVER的访问呢?
Xu\sg+A4x:dQ0 首先不得不提的是SQLSERVER链接服务器,在sql 2K中 企业 管理器===>安全性===>链接服务器. ITPUB个人空间wHw1gTm.R8Nv
SQLSERVER2005 or 2008中 Maragement studio 服务器对象==>链接服务器。
mB'P/y6v |'H {C:|0 这个链接服务器对象是如何来的? ITPUB个人空间8K \ TPw*M
默认情况下会只有本机一个,链接服务器名就是本机机器名,通过系统存储过程Execute sp_helpserver 可以查看,显示为name字段
如何新增链接服务器 ? ITPUB个人空间 \f6{p1I"kXk
A. 通过向导, ITPUB个人空间!|7ti.[*CJ3{l
1. 右键链接服务器--->新增链接服务器 ITPUB个人空间R;L_0O+ty!A
2. 输入链接服务器名[ 需要访问的服务器的机器名或是IP,如果别名无法解析到,则使用IP ] ,指定服务器类型为SQL SERVER,
5~4^;[Q*[h:mr0 3. 在安全性中选择'使用此安全上下文建立连接' 指定需要访问的服务器的SQL 登录账号和密码
.i;i bNk/Sd ~0s0 4。点确定,刷新链接服务器,则可视配置的链接服务器信息
,Z{$s'V!Lx0 B. 通过系统存储过程, ITPUB个人空间O$kM*N.F:}${a
建立链接sql server服务器,通常有两种情况:
x%\1B5c~ D-X0 1. 第一种情况,产品选”sql server”
D~:B.LS8U Y0 EXEC sp_addlinkedserver
.~5nW8ipC0 @server='linkServerName', ITPUB个人空间 YcJ#I [1Q
@srvproduct = N'SQL Server' ITPUB个人空间F c GxQ
这种情况,@server (linkServerName)就是要链接的sqlserver服务器名或者ip地址。
N%E-k%z+H6s f0 2.第二种情况,访问接口选“Microsoft OLE DB Provider Sql Server”或“Sql Native Client” ITPUB个人空间*D5odh2k!w:g
EXEC sp_addlinkedserver
#MQ4w~c+Y/fxG0 @server=' linkServerName ',
#h'E k|dP0 @srvproduct='',
'dTq"R,CN6`0 @provider='SQLNCLI', ITPUB个人空间j9wyz3[S1J#iz
@datasrc='sqlServerName'
.q*Ht&`!~CR0 这种情况,@datasrc(sqlServerName)就是要链接的实际sqlserver服务器名或者ip地址。 ITPUB个人空间IA(I;V#n-O
3.Sql server数据库引擎是通过上面设置的服务器名或者ip地址访问链接服务器,DTC服务也是通过服务器名或者ip地址访问链接服务器,所以要保证数据库引擎和DTC都能通过服务器名或者ip地址访问到链接服务器。 ITPUB个人空间 L$Fcn3nD
建立了链接,创建了数据库的登录访问: ITPUB个人空间!pp/^'\Fo |r*vd
EXEC sp_addlinkedsrvlogin
}P-KC,b B0 '上面创建的链接服务器的别名或是IP', --被访问的服务器别名 ITPUB个人空间.h,\e#N&P'ud
'false', ITPUB个人空间&F%b XS:xdfO
NULL,
c1B,{v\!k!w0 '账号', --帐号
&CE(g$^8k0 '登录密码' --密码
接下来就可以通过链接服务器来访问服务器B的AccountDB库下up_account存储过程了:
4_P,E)D\{`~H0 Execute [链接服务器别名].库名.dbo.存储过程
工作似乎已经结束了,但此时发现,执行存A服存储过程时会报 '未将[所用到的别名] 服务器配置为可用的RPC' ,如何解决?
B#wJ`a0]+eW6UE;U0 很简单,查看链接服务器的选项,将RPC RPC_Out 值由False 改为 TRUE 再调试,成功! ITPUB个人空间}[ J*I q@.]n
也有情况在这里无法更改,解决方案是:
C)])T&q [1]$l` F0 exec sp_configure 'show advanced options', 1; --默认是0 ITPUB个人空间 a\4Q F#PG1h3~p
GO
__*f$ckX U0 RECONFIGURE WITH OVERRIDE; ITPUB个人空间1Pd:C%D a*H)e
GO
存储过程调用不同数据库的数据_SQL SERVER存储过程中通过链接服务器访问远程服务器SQL实战_SQLSERVER跨平台数据访问
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值