我的远程数据库是MSSQL2000,系统是XP(SP3),本机:XP系统,数据库也是SQL2000
远程数据库IP:192.168.10.252 远程数据库名:CYQT_SERVER 远程表名:test
本地数据库:CYQT 本地表名:test
我在本机想写个存储过程,用事务的方式同步更新本机和远程数据库的表,
有朋友说:用下面这种方法进行连接就可以了,事务包括在语句中:EXEC master.dbo.sp_addlinkedserver @server = N'192.168.10.252,1433', @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'192.168.10.252,1433', @locallogin = NULL , @useself = N'False',
@rmtuser = N'sa', @rmtpassword = N''
select * from [192.168.10.252,1433].CYQT_SERVER.dbo.test我这样测试发现几个问题,
一、就是不知如何关闭连接,因为第二次调用时 sp_addlinkedserver 会出错,且也不知道,连接是否成功(连接不成功是不能再往下执行的)二、连接这里有朋友说写成这样: EXEC master.dbo.sp_addlinkedserver @server = N'192.168.10.252\远程数据库名,1433', @srvproduct=N'SQL Server'EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'192.168.10.252\远程数据库名,1433', @locallogin = NULL , @useself = N'False',
@rmtuser = N'sa', @rmtpassword = N''这里到底要写成哪样呢?三\还有朋友说要用事务要设置:MSDTC,这个在XP或win2003下面是要怎么设置呢?
求高手解惑,指教?
远程数据库IP:192.168.10.252 远程数据库名:CYQT_SERVER 远程表名:test
本地数据库:CYQT 本地表名:test
我在本机想写个存储过程,用事务的方式同步更新本机和远程数据库的表,
有朋友说:用下面这种方法进行连接就可以了,事务包括在语句中:EXEC master.dbo.sp_addlinkedserver @server = N'192.168.10.252,1433', @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'192.168.10.252,1433', @locallogin = NULL , @useself = N'False',
@rmtuser = N'sa', @rmtpassword = N''
select * from [192.168.10.252,1433].CYQT_SERVER.dbo.test我这样测试发现几个问题,
一、就是不知如何关闭连接,因为第二次调用时 sp_addlinkedserver 会出错,且也不知道,连接是否成功(连接不成功是不能再往下执行的)二、连接这里有朋友说写成这样: EXEC master.dbo.sp_addlinkedserver @server = N'192.168.10.252\远程数据库名,1433', @srvproduct=N'SQL Server'EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'192.168.10.252\远程数据库名,1433', @locallogin = NULL , @useself = N'False',
@rmtuser = N'sa', @rmtpassword = N''这里到底要写成哪样呢?三\还有朋友说要用事务要设置:MSDTC,这个在XP或win2003下面是要怎么设置呢?
求高手解惑,指教?
exec sp_addlinkedsrvlogin '链接名称','false',NULL,'sa','xxxxxxx'--查询
select * from 链接名称.数据库名.dbo.表名--不用后删除
exec sp_dropserver '数据库名','droplogins'
exec sp_dropserver '数据库名','droplogins'
这样不成功呢?
你可以测试,然后删除再试
exec sp_addlinkedsrvlogin '链接名称','false',NULL,'sa','xxxxxxx'--查询
select * from 链接名称.数据库名.dbo.表名--不用后删除
exec sp_dropserver '数据库名','droplogins'
您这个写法,我还有两个未解:
1、exec sp_addlinkedserver '链接名称',' ','SQLOLEDB','192.168.xx.xxx\SQLEXPRESS2008R2' 这个SQLEXPRESS2008R2 是不是指定当前MSSQL数据库的版本名称?还是数据库名,我的数据库是MSSQL2000呢?
2、假设这是一个存储过程,我后面有很多SELECT,再假设这个网络状况不太好,第二个SELECT时断网了,
这时存储过程按道理会返回,这时就并没有删除,这时这个sp_dropserver 就没有起到作用了,而当网络正常后,这时第二次调用sp_addlinkedserver ,sp_addlinkedsrvlogin ,时就会返回服务器已存在的错误,导致存储过程不能正常执行,这个时候该怎么办呢??
不直,直接给IP址就可以了.2. ,链接不是一次调用,如果经常链接,你就不要删除它.
如果网络断了的话.这个不用着急,存储过程你用事务处理,网络断就是全部事务回滚,还有:
exec sp_dropserver '数据库名','droplogins'
应改为: exec sp_dropserver '链接名称','droplogins'
如果网络断了的话.这个不用着急,存储过程你用事务处理,网络断就是全部事务回滚,---------------------------------
关于第二点我还有不同的看法:如果我是写在存储过程中,客户端肯定是经常调用这个存储过程了(没有只调用一次的理由),所以是经常链接,sp_addlinkedserver 会返回服务器已存在的错误,难道我不能先检测有无这个链接,有则不创建或者删除重建,无则创建,这样的办法吗?
---------------------------
Microsoft SQL-DMO (ODBC SQLState: 42000)
---------------------------
错误 7405: 异类查询要求为连接设置 ANSI_NULLS 和 ANSI_WARNINGS 选项。这将确保一致的查询语义。请启用这些选项,然后重新发出查询。
---------------------------
确定
---------------------------
百度了下,好像2000 要这样解决:
设置本地数据库的属性-->连接-->选上ANSI warning 和 ANSI nulls1、将存储过程生成脚本2、删掉原来的存储过程 3、在存储过程脚本前加上以下两句SQL ,然后重新生成存储过程SET ANSI_NULLS ON GO SET ANSI_WARNI.. 我在企业管理器中,这个数据库上右键选属性,根本没有这个连接的选项,其它的找了一下,也没有,这是什么情况呢?
exec sp_addlinkedserver 'mgfTS_lnk', ' ', 'SQLOLEDB ', '192.168.0.1'--制定連接對象,與間接名稱
exec sp_addlinkedsrvlogin 'mgfTS_lnk', 'false ',null, 'user1', 'passwd'--連接用戶/密碼
exec sp_serveroption 'mgfTS_lnk' ,'query timeout','30' ;--設置響應時間--開啓外部RPC配置,允许其它SQL Server使用RPC远程连接到本SQL Server
EXEC sp_serveroption 'mgfTS','rpc out','TRUE' (也可在企业管理器中-->数据库-->安全-->链接数据库-->点击你需要配置的链接数据库-->属性页-->
"server options"-->勾选rpc out)
以下是在被訪問端數據庫設置
--設定允許外聯exec sp_configure 'show advanced options',1 --開啓高級設置
reconfigure WITH OVERRIDE;exec sp_configure 'Ad Hoc Distributed Queries',1--允許openrowset opendatasource訪問
reconfigure WITH OVERRIDE;
exec sp_configure 'show advanced options',0 --關閉高級設置
reconfigure WITH OVERRIDE;--在其他服務器上的調用方式
SELECT * FROM mgfTS_lnk.TestDB.dbo.proTable where proName like '%PAPB%'
注意使用链接事务操作远端table不能使用try catch.
然后这东西性能很一般,建议使用同步链解决问题