我的远程数据库是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下面是要怎么设置呢?
求高手解惑,指教?

解决方案 »

  1.   

    exec sp_addlinkedserver '链接名称',' ','SQLOLEDB','192.168.xx.xxx\SQLEXPRESS2008R2'
    exec sp_addlinkedsrvlogin '链接名称','false',NULL,'sa','xxxxxxx'--查询
    select * from  链接名称.数据库名.dbo.表名--不用后删除
    exec sp_dropserver '数据库名','droplogins'
      

  2.   

    这个链接名称怎么写啊?按我帖中的写法
    exec sp_dropserver '数据库名','droplogins'
    这样不成功呢?
      

  3.   

    用字母,自定义:AAA
    你可以测试,然后删除再试
      

  4.   

    exec sp_addlinkedserver '链接名称',' ','SQLOLEDB','192.168.xx.xxx\SQLEXPRESS2008R2'
    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 ,时就会返回服务器已存在的错误,导致存储过程不能正常执行,这个时候该怎么办呢?? 
      

  5.   

    1、exec sp_addlinkedserver '链接名称',' ','SQLOLEDB','192.168.xx.xxx\SQLEXPRESS2008R2' 这个SQLEXPRESS2008R2 是不是指定当前MSSQL数据库的版本名称?还是数据库名,我的数据库是MSSQL2000呢?
    不直,直接给IP址就可以了.2. ,链接不是一次调用,如果经常链接,你就不要删除它.
    如果网络断了的话.这个不用着急,存储过程你用事务处理,网络断就是全部事务回滚,还有:
    exec sp_dropserver '数据库名','droplogins'
    应改为: exec sp_dropserver '链接名称','droplogins'
      

  6.   

    2. ,链接不是一次调用,如果经常链接,你就不要删除它.
    如果网络断了的话.这个不用着急,存储过程你用事务处理,网络断就是全部事务回滚,---------------------------------
    关于第二点我还有不同的看法:如果我是写在存储过程中,客户端肯定是经常调用这个存储过程了(没有只调用一次的理由),所以是经常链接,sp_addlinkedserver 会返回服务器已存在的错误,难道我不能先检测有无这个链接,有则不创建或者删除重建,无则创建,这样的办法吗?
      

  7.   

    你的语句,只有创建链接的语句,没有drop。所以第二次再创建链接,会报错,因为链接已经存在。
      

  8.   

    回复七楼:现在我发现这样写在存储过程中还有一个问题,报如下的错误:
    ---------------------------
    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.. 我在企业管理器中,这个数据库上右键选属性,根本没有这个连接的选项,其它的找了一下,也没有,这是什么情况呢?
      

  9.   

    在SQL2005中使用DBlink方式進行跨服務器訪問,更加安全,且可以針對連接進行安全設定。以下是在發起訪問端數據庫設置--創建服務器連接
    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.
    然后这东西性能很一般,建议使用同步链解决问题