2017-10-10 2 views
0

Dans une procédure stockée je besoin de boucler le tableau suivant:Dans une procédure stockée comment table de boucle peut vous A et puis mettre à jour le tableau 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) 

Et pour chaque enregistrement qui est en boucle j'effectuer cette mise à jour :

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

S'il existe une meilleure façon d'effectuer cela, alors je suis ouvert aux suggestions. Fondamentalement, la première requête fait un filtre basé sur le INNER JOIN pour déterminer quels enregistrements doivent être mis à jour. Ensuite, ces enregistrements filtrés sont mis en boucle et mis à jour avec un nouveau RoleID.

+1

répondu à https://stackoverflow.com/questions/1604091/update-a-table-using-join-in-sql-server –

+1

Vous devez faire un paradigme changer dans la façon dont vous regardez les données. Looping est horriblement inefficace. Vous devez changer votre état d'esprit de penser à ce que vous devez faire à une rangée et penser plutôt à ce que vous devez faire à une colonne. –

Répondre

1

Mise à jour avec JOIN:

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

Vous pouvez utiliser un CTE pour faire le 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 

Donc, vous tapez simplement envelopper la requête dans un CTE puis effectuez la UPDATE sur la table retournée par la CTE. La valeur RoleId sera propagée aux enregistrements de la table réelle, UsersInRoles.