SQL Server遍历查询出的数据集合

需求场景:

公司服务迁移,需要将旧的用户数据表迁移到新的以组角色权限管理的表中,原来只有用户信息,将用户信息使用自己写的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
 
  
  

猜你喜欢

转载自blog.csdn.net/qq_33594101/article/details/105956318