创建下面的存储过程进行数据处理:
create proc p_merg
as
declare @srvname varchar(250),@username varchar(250),@pwd varchar(100)--定义游标,取得各远程服务器的信息
declare #tb cursor for select 服务器名,用户名,密码 from 保存远程信息的表
open #tb
fetch next from #tb into @srvname,@username,@pwd
while @@fetch_status=0
begin
--创建链接服务器
exec sp_addlinkedserver  'Link_server','','SQLOLEDB',@srvname
exec sp_addlinkedsrvlogin 'Link_server','false',null,@username,@pwd --数据导入处理,根据你的情况写
insert into 表 select * from Link_server.数据库名..表名 --数据处理完成后删除链接服务器
exec sp_dropserver 'Link_server','droplogins'
fetch next from #tb into @srvname,@username,@pwd
end
close #tb
deallocate #tbgo创建一个JOB,设置每周一执行,JOB的执行语句如下:exec p_merg

解决方案 »

  1.   

    zjcxc(邹建) 你试验过没有,你这么做不行,出错因为连接服务器没有建立,exec sp_addlinkedsrvlogin 'Link_server','false',null,@username,@pwd
    之后只有加GO
    才能真正提交建立连接服务器
      

  2.   

    邹建
    创建下面的存储过程进行数据处理:
    create proc p_merg
    as
    declare @srvname varchar(250),@username varchar(250),@pwd varchar(100)--定义游标,取得各远程服务器的信息
    declare #tb cursor for select 服务器名,用户名,密码 from 保存远程信息的表
    open #tb
    fetch next from #tb into @srvname,@username,@pwd
    while @@fetch_status=0
    begin
    --创建链接服务器
    exec sp_addlinkedserver  'Link_server','','SQLOLEDB',@srvname
    exec sp_addlinkedsrvlogin 'Link_server','false',null,@username,@pwd --数据导入处理,根据你的情况写
    insert into 表 select * from ^这里出错(因为link_server没有建立)Link_server.数据库名..表名 --数据处理完成后删除链接服务器
    exec sp_dropserver 'Link_server','droplogins'
    fetch next from #tb into @srvname,@username,@pwd
    end
    close #tb
    deallocate #tbgo创建一个JOB,设置每周一执行,JOB的执行语句如下:exec p_merg麻烦你在帮忙给我看看阿谢谢了!!
      

  3.   

    不好意思,是我搞错了.不一定要加go,这样处理就行了
    改正如下:.create proc p_merg
    as
    declare @srvname varchar(250),@username varchar(250),@pwd varchar(100)--定义游标,取得各远程服务器的信息
    declare #tb cursor for select 服务器名,用户名,密码 from 保存远程信息的表
    open #tb
    fetch next from #tb into @srvname,@username,@pwd
    while @@fetch_status=0
    begin
    --创建链接服务器
    exec sp_addlinkedserver  'Link_server','','SQLOLEDB',@srvname
    exec sp_addlinkedsrvlogin 'Link_server','false',null,@username,@pwd --数据导入处理,根据你的情况写,用exec来执行处理语句,这样就不会错了.
    exec('insert into 表 select * from Link_server.数据库名..表名') --数据处理完成后删除链接服务器
    exec sp_dropserver 'Link_server','droplogins'
    fetch next from #tb into @srvname,@username,@pwd
    end
    close #tb
    deallocate #tbgo
      

  4.   

    不好意思,是我搞错了.不一定要加go,这样处理就行了
    改正如下:.create proc p_merg
    as
    declare @srvname varchar(250),@username varchar(250),@pwd varchar(100)--定义游标,取得各远程服务器的信息
    declare #tb cursor for select 服务器名,用户名,密码 from 保存远程信息的表
    open #tb
    fetch next from #tb into @srvname,@username,@pwd
    while @@fetch_status=0
    begin
    --创建链接服务器
    exec sp_addlinkedserver  'Link_server','','SQLOLEDB',@srvname
    exec sp_addlinkedsrvlogin 'Link_server','false',null,@username,@pwd --数据导入处理,根据你的情况写,用exec来执行处理语句,这样就不会错了.
    exec('insert into 表 select * from Link_server.数据库名..表名') --数据处理完成后删除链接服务器
    exec sp_dropserver 'Link_server','droplogins'
    fetch next from #tb into @srvname,@username,@pwd
    end
    close #tb
    deallocate #tbgo
      

  5.   

    还是不要通过SP的好,我给你一个方法:
    1.写一个ADDLINKEDSERVER的脚本文件ADDLINKEDSERVER.SQL:
      EXEC sp_addlinkedserver 'svrname','','SQLOLEDB',NULL,NULL,'DRIVER={SQL Server};SERVER=server_name;UID=sa;PWD=admin;'
    go
    exec sp_addlinkedsrvlogin  @rmtsrvname='auchan',@useself='false',@locallogin='sa',@rmtuser='sa',@rmtpassword=''
    GO
    2.再写一个ADDSERVER.BAT文件
     ISQL -Usa -P -S%computername% -d db_name -n -i addlinkedserver.sql
    3.你可以在SP中调用这个脚本,也可以在JOB中运行这个批处理文件。这样就可以非常的灵活处理。
    4.同样,你也可以写一个REMOVE这个LINKEDSERVER的脚本。
      

  6.   

    你可以在JOB中分几步运行。比如:
    1.addlinkedserver
    2.retrive data 
    3.drop linked server
      

  7.   

    不建议临时添加连接服务器,你这样做还不如:
    insert 本地库名..表名 select * from OPENDATASOURCE('SQLOLEDB','Data Source=远程ip;User ID=sa;Password=密码').库名.dbo.表名你最好事先添加好所有的服务器,你的sp或脚本,直接 insert xx select * from xx.xx.xx.xx 就可以了