在存储过程你怎么能循环表A,然后更新表B中

问题描述:

在存储过程中,我需要下表圈:在存储过程你怎么能循环表A,然后更新表B中

SELECT * 
FROM dbo.UsersInRoles 
INNER JOIN Application_Users ON UsersInRoles.AppUserID = Application_Users.AppUserID 
WHERE (UsersInRoles.ApplicationId = @ApplicationId) 
AND (UsersInRoles.RoleId = @CurrentRoleId) 
AND (Application_Users.LastLogin < @StartDate) 

而对于被循环的每个记录我需要执行此更新:

UPDATE UsersInRoles 
SET UsersInRoles.RoleId = @DenyRoleId 
WHERE (UsersInRoles.ApplicationId = @ApplicationId) 
AND (UsersInRoles.RoleId = @CurrentRoleId) 

如果有更好的方法来执行此操作,那么我愿意提供建议。基本上,第一个查询根据INNER JOIN执行过滤器来确定哪些记录需要更新。然后,这些过滤的记录将循环并更新为新的RoleID

+1

回答https://*.com/questions/1604091/update-a-table-using-join-in-sql-server –

+1

你需要做一个范例以你观察数据的方式转移。循环是非常低效的。你必须改变自己的想法,从思考你需要做什么到某一行,而是想想你需要做什么。 –

更新与加盟:

UPDATE UIR 
SET UIR.RoleId = @DenyRoleId 
FROM UsersInRoles UIR 
INNER JOIN Application_Users ON UIR.AppUserID = Application_Users.AppUserID 
WHERE (UIR.ApplicationId = @ApplicationId) 
AND (UIR.RoleId = @CurrentRoleId) 
AND (Application_Users.LastLogin < @StartDate) 

可以使用CTEUPDATE

;WITH ToUpdate AS (
    SELECT uir.RoleId 
    FROM dbo.UsersInRoles AS uir 
    INNER JOIN Application_Users AS au 
     ON uir.AppUserID = au.AppUserID 
    WHERE (uir.ApplicationId = @ApplicationId) AND 
     (uir.RoleId = @CurrentRoleId) AND 
     (au.LastLogin < @StartDate) 
) 
UPDATE ToUpdate 
SET RoleId = @DenyRoleId 

所以,你只需要输入包裹查询在CTE,然后由CTE返回的表进行UPDATERoleId值将传播到实际表的记录UsersInRoles