在存储过程你怎么能循环表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
。
答
更新与加盟:
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)
答
可以使用CTE
做UPDATE
:
;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
返回的表进行UPDATE
。 RoleId
值将传播到实际表的记录UsersInRoles
。
回答https://*.com/questions/1604091/update-a-table-using-join-in-sql-server –
你需要做一个范例以你观察数据的方式转移。循环是非常低效的。你必须改变自己的想法,从思考你需要做什么到某一行,而是想想你需要做什么。 –