2017-02-07 1 views
1
ALTER PROCEDURE [User].GetUserByEmail 
    @Email VARCHAR(200), 
    @GetActiveOnly BIT 
AS 
BEGIN 
    IF (@GetActiveOnly = 1) 
    BEGIN 
     SELECT 
      portalUser.PortalUserId AS 'UserId', 
      organisation.OrganisationId AS 'OrganisationId', 
      organisation.LookUpOrganisationTypeId AS 'OrganisationTypeId' 
     FROM  
      Admin.PortalUser portalUser 
     INNER JOIN 
      Admin.LookUpPortalUserRole userRole ON userRole.LookUpPortalUserRoleId = portalUser.LookUpPortalUserRoleId 
     INNER JOIN 
      Admin.Organisation organisation ON organisation.OrganisationId = portalUser.OrganisationId 
     WHERE 
      portalUser.Email = @Email 
      AND portalUser.IsActive = 1 
    END 
    ELSE 
    BEGIN 
     SELECT 
      portalUser.PortalUserId AS 'UserId', 
      organisation.OrganisationId AS 'OrganisationId', 
      organisation.LookUpOrganisationTypeId AS 'OrganisationTypeId' 
     FROM  
      Admin.PortalUser portalUser 
     INNER JOIN 
      Admin.LookUpPortalUserRole userRole ON userRole.LookUpPortalUserRoleId = portalUser.LookUpPortalUserRoleId 
     INNER JOIN 
      Admin.Organisation organisation ON organisation.OrganisationId = portalUser.OrganisationId 
     WHERE 
      portalUser.Email = @Email 
    END 
END 

Dans la procédure stockée ci-dessus, lorsque @Getactiveonly est vrai, alors il ne devrait prendre que les utilisateurs actifs sinon il devrait prendre les deux utilisateurs actifs et inactifs. i.e. IF (@GetactiveOnly = 1) alors il va chercher les utilisateurs dont Isactive est 1 que sinon il va chercher tous les utilisateurs dont IsActive est 0 et 1.méthode pour écrire la méthode Si dans la procédure stockée

pourrait-il être écrit d'une manière plus simple d'éviter la duplication des instructions select?

+0

Comme @Peter avait répondu oui c'est possible. Je vous conseille seulement de vérifier les plans de requête pour les deux versions. Parfois, OU peut entraîner des problèmes. – Serg

Répondre

2

Vous pouvez appliquer une logique plus booléenne, conduisant à cette requête unifiée:

SELECT ... 
WHERE portalUser.Email = @Email 
AND (@GetActiveOnly = 0 OR portalUser.IsActive = 1) 

En d'autres termes:

  • Pour 0, la première partie est vraie, ce qui rend la seconde partie hors de propos.
  • Pour 1, la première partie est FAUX et la deuxième partie détermine le résultat.