exec sp_addlinkedserver  'srv_lnk1','','SQLOLEDB','127.0.0.1'
     exec sp_addlinkedsrvlogin 'srv_lnk1','false',null,'test',''
     exec sp_addlinkedserver  'srv_lnk2','','SQLOLEDB','127.0.0.2'
     exec sp_addlinkedsrvlogin 'srv_lnk2','false',null,'test',''
这四条要先执行

解决方案 »

  1.   

    我希望在使用完连接后自动清除掉srv_lnk1,srv_lik2。
       直接使用exec sp_dropserver 'srv_lnk1','droplogins'就可以了吗?应该放在什么地方比较合适。
      

  2.   

    执行完成后,再执行
    select * from srv_lnk1.test.dbo.table1 join srv_lnk.test.dbo.table2 on 条件
    不能放在一块执行,放在一块执行就会报错.
      

  3.   

    是啊,那个compare1的字符串是后执行的。去查询分析器看,已经产生了srv_lik1。还地清除一次:(
      

  4.   

    因为SQL语句执行之前,会先检查SQL语句,确定执行的算法.如果是将5个语句放在一齐,因为检查算法是先进行的,所以没有任何语句被执行
    此时就无法确定第5条语句的算法,因为 srv_lnk1 链接服务器还没有被建立起来,所以就报错.你在查询分析器中执行一样,要在
    select * from srv_lnk1.test.dbo.table1 join srv_lnk.test.dbo.table2 on 条件
    前加go,才不会报错.
      

  5.   

    删除链接服务器用这个就行了:
    exec sp_dropserver 'srv_lnk1','droplogins'
      

  6.   

    邹老大:
        不行啊,无论是在select前还是在exec后加go还是不可以,报错:在“go”附近有错误。
        
    System.Data.SqlClient.SqlConnection conn1 = new System.Data.SqlClient.SqlConnection();
    conn1.ConnectionString ="server=192.168.2.10;uid=sa;pwd=;database=test";
    System.Data.SqlClient.SqlConnection conn2 = new System.Data.SqlClient.SqlConnection();
    conn2.ConnectionString ="server=192.168.2.10;uid=sa;pwd=;database=test";
    conn1.Open();
    conn2.Open();string connstring1 = "exec sp_addlinkedserver  'srv_lnk1','','SQLOLEDB','"+source1.Text+"'"
    +"exec sp_addlinkedsrvlogin 'srv_lnk1','false',null,'"+userid1.Text+"','"+pw1.Text+"' "
    +"go";
    string connstring2 = "exec sp_addlinkedserver  'srv_lnk2','','SQLOLEDB','"+source2.Text+"'"
       +"exec sp_addlinkedsrvlogin 'srv_lnk2','false',null,'"+userid2.Text+"','"+pw2.Text+"' "
     +"go";System.Data.SqlClient.SqlCommand first1 = new SqlCommand(connstring1,conn1);
    first1.ExecuteNonQuery();
    System.Data.SqlClient.SqlCommand first2 = new SqlCommand(connstring2,conn2);
    first2.ExecuteNonQuery();string compare1 =   "go SELECT a.name,b.name,b.length,c.name,b.isnullable "
    +"FROM srv_lik1."+database1.Text+"."+"dbo.sysobjects a join "+"srv_lnk1."+database1.Text+".dbo.syscolumns b "
    +"on a.id=b.id join srv_lnk1."+database1.Text+".dbo.systypes c "
    +"on b.xtype=c.xtype "
    +"where a.xtype='U' and a.name in (select b.name from srv_lnk2."+database1.Text+".dbo.sysobjects b where b.xtype='U') "
    +"and c.name<>'sysname' and b.name<>'dtproperties'";
    System.Data.SqlClient.SqlDataAdapter cadapter1 = new SqlDataAdapter(compare1,conn1);
    DataGrid1.DataSource = ds1;
    DataGrid1.DataBind();conn1.close();
    ……     字符串那里有点乱,不过大体就是这样了。帮忙看看吧。
        或许我这么想,算法就有很多问题。有更好的方法吗?
      

  7.   

    我不是要你在程序中加gogo是查询分析器/osq/isql专用的
    它不是sql语句的一部分.所以你在程序中加go当然错啦.
      

  8.   

    我的意思是要你分两步执行而已.
    不要go(查询分析器测试才要)将上面的go去掉它
      

  9.   

    我的意思是要你分两步执行而已.
    不要go(查询分析器测试才要)将上面的go去掉它应该就可以了另外,直接用openrowset不好吗?创建了链接服务,使用后马上删除,那和直接用openrowset没有什么区别
      

  10.   

    去掉go不行
        我去试试openrowset。
      

  11.   

    弱智问题一个
      使用openrowset时
    SELECT *
    FROM OPENROWSET('sqloledb','192.168.2.10';'sa';'','SELECT * FROM test.dbo.syscolumns') a
      报错:未能创建 OLE DB 提供程序 'SQLOLEDB' 的实例。
        笨哈,怎么回事,按照帮助里的例子做的啊。