我打算在程序中用三个存储过程,对远程数据库和本地数据库进行同步等操作
第一个创建链接服务器,登陆
第二个做同步等操作
第三个删除链接服务器。
首先我需要创建好这三个存储过程后,我在程序中定期依次执行这三个存储过程进行同步操作。
我是这样做的:create proc addlinkedserver --第一个存储过程,如果存在该链接服务器,删除,然后创建,否则直接创建
as
begin
if exists (select 1 from master.dbo.sysservers where srvname=N'linkservername')
  sp_dropserver N'linkservername','droplogins'--存在就删除
 --否则创建并登陆
  sp_addlinkedserver N'linkservername',false
   declare @targetServerName nvarchar(50)
   declare @userid nvarchar(50)
   declare @pwd nvarchar(50)
    select @targetServerName=服务器的列,@userid=登陆名,@pwd =登陆密码 from 某表 where 条件
    exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', @targetServerName 
    exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, @userid, @pwd
    --此存储过程用变量
end
go--第二个存储过程,同步,互操作用
create proc sync_proc
as
 begin
  insert into 列集合 select 列集合 from linkservername.数据库名.hr.person where 条件
  --后面的略。。
 end
 go 
  问题就在这里,第二个存储过程直接执行是错的,因为假设对方数据库名是不确定的,需要我从某个表中取出来代替上面的数据库名。该怎么做?
换句话说,linkservername.数据库名.架构名.表名,怎么用变量代替? 
 

解决方案 »

  1.   

    你要考虑你执行第二个存储过程的哪个账号是否有跨服务器权限。
    试试这样:
    create proc sync_proc
     as
      begin
    declare @name nvarchar(128)
    select @name='linkservername.'+(select name from 表)+'.hr.person'
       insert into 列集合 select 列集合 from @name where 条件
       --后面的略。。
      end
      go 
     
      

  2.   


    create proc sync_proc
    as
     begin
    declare @sql varchar(4000),@datebase varchar(30)
    select @datebase=数据库名 from 你的列 where 你的条件
    select @sql=isnull(@sql,'')+'insert into 列集合 select 列集合 from linkservername.'+@datebase+'.hr.person where 条件'
    exec(@sql);
      --后面的略。。
     end
     go