需求场景:
公司服务迁移,需要将旧的用户数据表迁移到新的以组角色权限管理的表中,原来只有用户信息,将用户信息使用自己写的C++程序导入到新的用户表后,需要将用户统一划分到某一组里,这时需要遍历查询到的用户id,将这个id和组id绑定到另一张关系表中。
在导入用户数据表时,因为以前有重复的电话和邮箱,新的表要将这些做unique,所以对这些重复的数据进行了特殊处理,这里不做讨论。
一、使用游标
查询到用户的所有id集合,然后使用游标遍历,再用存储过程将这个id插入到关系表中;
存储过程
create proc GroupInsertUser(@groupid bigint, @userid bigint)
as
insert into GroupOwnUser (groupId,userId,userIdentity, state,createDTime,cancellationDTime) values(@groupid, @userid,1, 1, GETDATE(),GETDATE())
执行的语句:
--声明一个变量
declare @userid as bigint;
--声明一个游标用来遍历查询到的结果
declare C_userID CURSOR for select userId from UserInfo;
--打开游标
open C_userID;
--获取游标指向的数据
fetch next from C_userID into @userid;
//使用游标遍历集合
while @@FETCH_STATUS = 0
BEGIN
--执行具体的操作
exec GroupInsertUser 6382111122601811969, @userid
--游标指向下一条数据
FETCH next from C_userID into @userid;
END
--关闭游标
CLose C_userID
--释放游标
DEALLOCATE C_userID;
经过以上操作,我最终将所有用户建立起了与组的关系;
二、使用表变量
使用表变量是面向集合的一种操作方法
--声明表变量
DECLARE @userid TABEL(
userid bigint
);
--将源表中的数据插入到表变量中
INSERT INTO @temp(userId)
SELECT userId FROM UserInfo
--声明变量
DECLARE @userid as bigint;
while EXISTS(SELECT userId FROM @temp)
BEGIN
SET ROWCOUNT 1
SELECT @userid = userId From @temp;
exec GroupInsertUser 6382111122601811969, @userid
SET ROWCOUNT 0
DELETE FROM @temp WHERE userId = @userid;
END
三、使用临时表
临时表也可以实现表变量的功能,临时表会在tempdb中创建,使用#创建临时表会在语句执行完成后自动删除,使用##创建的表需要手动删除;
--判断临时表是否已经存在
IF OBJECT_ID('tempdb.dbo.##gu','U') IS NOT NULL DROP TABLE dbo.#gu;
GO
SELECT userId
INTO dbo.#gu
FROM UserInfo
--声明变量
DECLARE @userid AS BIGINT;
while EXISTS(SELECT userId FROM dbo.##gu)
BEGIN
SET TOP 1
SELECT @userid = userId From dbo.##gu;
exec GroupInsertUser 6382111122601811969, @userid
SET ROWCOUNT 0
DELETE FROM @temp WHERE userId = @userid;
END
--判断临时表是否存在,删除
if (exists (select *from tempdb.dbo.sysobjects where id = object_id(N'[tempdb].[dbo].[##gu]') and type = 'U'))
drop table dbo.##gu