根据工作需要有时需要迁移大量的数据,于是按自己的想法做了一个数据迁移的存储过程,欢迎大家提出更好的建议,完整的存储过程如下: create procedure DataMove --创建存储过程 --ALTER procedure DataMove --修改存储过程 as BEGIN declare @MaxID int--插入到文章表后的新ID declare @Count int--统计迁移数据的条数 set @Count=0 --如存在跨库链接服务器,则删除 if exists(select * from master..sysservers where srvname= 'srv_lnk') exec sp_dropserver 'srv_lnk', 'droplogins' --建立跨库链接服务器 exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','172.16.14.55'--最后一个参数为数据库服务器地址 exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa','sa'--最后两个个参数为数据库服务器的登录用户名和密码
declare mycursor cursor for select id from srv_lnk.kxyjdb.dbo.PageContent where 主类=5 declare @id int open mycursor
fetch next from mycursor into @id while @@fetch_status = 0 begin if not exists(select * from ZWY.dbo.Article a where a.Title=(select 标题 from srv_lnk.kxyjdb.dbo.PageContent b where id=@id)) BEGIN begin tran mytran --开始执行事务 --向文章表导入数据 INSERT ZWY.dbo.Article(CategoryID,Title, [Content],UserID, Username,IsCheck,IsLock) SELECT 46,标题,内容,2,'admin',1,0 FROM srv_lnk.kxyjdb.dbo.PageContent WHERE id=@id set @MaxID=@@identity --得到最新插入记录的ID --print @MaxID
--向文章字段扩展表导入数据 INSERT ZWY.dbo.ExtendTable_ArticleType_9(ArticleID, XueKe, KanMing,JuanQi, CaiJiWangZhi, CaiJiShiJian,FuJian) SELECT @MaxID,学科,发者,发时,采址,采时, '/attachment/'+附件 FROM srv_lnk.kxyjdb.dbo.PageContent WHERE id=@id
set @Count=@Count+1
if @@error<>0 --判断如果两条语句有任何一条出现错误 begin rollback tran mytran--开始执行事务的回滚,恢复的转账开始之前状态 end else --如何两条都执行成功 begin commit tran mytran--执行这个事务的操作 end END--END if
fetch next from mycursor into @id end--end while close mycursor DEALLOCATE mycursor
exec sp_dropserver 'srv_lnk', 'droplogins'--删除跨库链接服务器
return @Count --返回导入记录条数 END --测试存储过程 --declare @return_status int --exec @return_status= DataMove --print @return_status |
|
来自: tjmarm > 《Sql Server》