欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sqlserver 利用存储过程 迁移数据

程序员文章站 2022-04-20 23:50:12
...

最近项目升级,有些表的结构已近被改掉了。所以需要利用存储过程来将旧表的数据导入到新表中。学完后,特地在此做一个相关笔记。

1、数据表结构
t1数据表sqlserver 利用存储过程 迁移数据
t2数据表
sqlserver 利用存储过程 迁移数据
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'
相关标签: sqlserver