2017-10-10 24 views
0

在存儲過程中,我需要下表圈:在存儲過程你怎麼能循環表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://stackoverflow.com/questions/1604091/update-a-table-using-join-in-sql-server –

+1

你需要做一個範例以你觀察數據的方式轉移。循環是非常低效的。你必須改變自己的想法,從思考你需要做什麼到某一行,而是想想你需要做什麼。 –

回答

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) 
0

可以使用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