sql server 实现跨数据库访问
这几天做项目遇到的问题,困扰我一整天。终于解决了,必须拿小本本记下了。
先放个代码
--以后不再使用时删除链接服务器
exec sp_droplinkedsrvlogin 'QCDB1',null
exec sp_dropserver 'QCDB1'
--建立连接
EXEC sp_addlinkedserver
@server='QCDB1', --链接服务器别名
@srvproduct='1433',
@provider='SQLOLEDB',
@datasrc='192.168.8.9' --要访问的的数据库所在的服务器的ip
GO
EXEC sp_addlinkedsrvlogin
'QCDB1', --链接服务器别名
'false',
NULL,
'admin', --要访问的数据库的用户
'123654789' --要访问的数据库,用户的密码
GO
select * from [QCDB1].[QCDB].[dbo].Examine
其中,"链接服务器别名"随便取, 只需修改 "要访问的的数据库所在的服务器的ip"
,“用户”和“密“码 (我用的要访问的sql sever数据库sa账号和密码)。
成功执行后,刷新SSMS左侧链接服务器,会出现新建的链接服务器
使用的格式:SELECT * FROM [链接服务器别名].[数据库名].[dbo].[表名]如:
select * from [QCDB1].[QCDB].[dbo].Examine
需要注意的是,使用update去更新表数据时,sql语句前面要加上一个
SET XACT_ABORT on
否则会报错。如:
SET XACT_ABORT ON
update [QCDB1].[QCDB].[dbo].Examine set result='成功'
where SCId=123
这个是设置事务回滚的,默认为OFF
当为ON时,如果你存储中的某个地方出了问题,整个事务中的语句都会回滚
为OFF时,只回滚错误的地方,语句继续执行(很危险!dalao说的)
删除链接服务器语法
--第一个参数是要删除的链接服务器;第二个参数作用是连带删除该链接服务器登录映射
exec sp_dropserver '链接服务器名称', 'droplogins '
使用链接服务器UPDATE比较慢的原因:
--链接服务器和本地服务器关联表更新
UPDATE 链接服务器.数据库名.dbo.表名
SET 列名1= **,列名2=**
where 主键列 in (select 列名 from 本地表)
--将本地服务器表的列内容取出后直接更新
UPDATE 链接服务器.数据库名.dbo.表名
SET 列名1= **,列名2=**
where 主键列 in (1,2,3,4,5,6)
第一个查询 基本上半个小时出不来数据
第二个一秒不到就出来了
--下面语句直接查询也是很快的基本不到一秒
select * from 链接服务器.数据库名.dbo.表名
where 主键列 in (select 列名 from 本地表)
因为update是要依次写入日志的,而select 一次查询出结果。能尽量避免这样就尽量避免,如果真的遇到这种情况,最好分两步做先查询出数值,再去更新,就会快很多了。
哈哈哈哈哈哈~~快乐的程序猿呀!