sqlserver 利用存储过程 迁移数据
程序员文章站
2022-04-20 23:50:12
...
最近项目升级,有些表的结构已近被改掉了。所以需要利用存储过程来将旧表的数据导入到新表中。学完后,特地在此做一个相关笔记。
1、数据表结构
t1数据表
t2数据表
2、连接远程数据库
-- 添加远程连接
EXEC sp_addlinkedserver
@server = 'ipas', -- 目标服务器别名
@srvproduct = '', -- 产品名称,因为数据库是sqlserver,设置为空
@datasrc = '192.168.1.111' , -- 目标服务器名称
@provider = 'SQLOLEDB'
-- 添加远程连接的登入名
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'ipas' , -- 与以上 @server 同名
@useself = 'false' ,
@locallogin = NULL ,
@rmtuser = 'sa' , -- 数据库用户
@rmtpassword = 'admin123' -- 登入密码
--利用远程连接查询表,ipas 为定义的服务器别名;t1为表名
SELECT * FROM ipas.dbo.t1
3、创建存储过程
CREATE PROCEDURE test
-- @pid_start 在这里为 开始查询添加的表数据 id
@pid_start int,
-- @pid_end 为 结束循环添加的表数据 id
@pid_end int
AS
BEGIN
-- 定义变量
DECLARE @num int;
-- 定义用来接收数据库字段的变量
DECLARE @d_t_id int;
DECLARE @d_t_name VARCHAR ( 255 );
DECLARE @d_t_value VARCHAR ( 255 );
DECLARE @d_t_age int;
-- 设置开始循环的值
SET @num = @pid_start;
WHILE @num < @pid_end
BEGIN
-- 定义游标
DECLARE cu_t CURSOR
-- 获取数据
FOR SELECT * FROM ipas.dbo.t1 WHERE id >= @num AND id <= @pid_end
-- 打开游标
OPEN cu_t
-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
FETCH NEXT from cu_t INTO @d_t_id,@d_t_name,@d_t_value,@d_t_age
-- 判断获取下一条数据是否成功
WHILE @@FETCH_STATUS = 0
BEGIN
if not EXISTS (SELECT id FROM t2 where id = @d_t_id)
print @d_t_id
BEGIN
INSERT INTO t2 (name, age ) VALUES (@d_t_name,@d_t_age )
END
set @aaa@qq.com_t_id;
FETCH NEXT from cu_t INTO @d_t_id,@d_t_name,@d_t_value,@d_t_age
END
CLOSE cu_t /* 关闭游标 */
DEALLOCATE cu_t /* 删除游标 */
set @aaa@qq.com+1;
print @num;
END
END
4、执行存储过程
-- @pid_start ,@pid_end 为存储过程定义的需要输入的变量
EXEC test @pid_start = 1,@pid_end = 2
5、 删除建立的远程连接
EXEC sp_dropserver
@server = 'ipas',
@droplogins = 'droplogins'
上一篇: Oracle
下一篇: html+css+js制作一个简易计算器