我打算在程序中用三个存储过程,对远程数据库和本地数据库进行同步等操作
第一个创建链接服务器,登陆
第二个做同步等操作
第三个删除链接服务器。
首先我需要创建好这三个存储过程后,我在程序中定期依次执行这三个存储过程进行同步操作。
我是这样做的: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.数据库名.架构名.表名,怎么用变量代替?
第一个创建链接服务器,登陆
第二个做同步等操作
第三个删除链接服务器。
首先我需要创建好这三个存储过程后,我在程序中定期依次执行这三个存储过程进行同步操作。
我是这样做的: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.数据库名.架构名.表名,怎么用变量代替?
试试这样:
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
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