J'ai une instruction de sélection SQL Server qui est censée fonctionner au cas par cas
Cas 1 : lorsque l'ID de rôle utilisateur fourni est admin, toutes les données seront sélectionnées
Cas 2 : En dehors du rôle d'administrateur du formulaire, la sélection retournera toutes les données à l'exception des données d'administration.
DECLARE @UserRoleID INT = 3
SELECT urp.id AS 'iD'
,canview AS 'read'
,cancreate AS 'create'
,canedit AS 'update'
,candelete AS 'delete'
,ur.description AS 'userRole'
,ch.description AS 'rightsToMenu'
,urp.creator AS 'creator'
,urp.datecreated AS 'dateCreated'
,urp.datemodified AS 'dateModified'
,urp.modifier AS 'modifier'
FROM userrolepermission urp
INNER JOIN userrole ur ON urp.userroleid = ur.id
INNER JOIN channel AS ch ON urp.channelid = ch.id
WHERE urp.UserRoleID IN (
(
CASE
WHEN @UserRoleID = 1
THEN ('2')
ELSE CAST(@UserRoleID AS NVARCHAR)
END
-- tried this also
WHERE (
CASE
WHEN urp.userroleid = @UserRoleID
AND @UserRoleID > 1
THEN @UserRoleID
ELSE @UserRoleID
END IN (
SELECT ID
FROM UserRole(NOLOCK)
)
)
)
)
Ici, la condition renvoie toutes les données qui ne sont pas souhaitées.
Example:
@UserRoleID = 1 - Récupérez ensuite toutes les données et Si @UserRoleID! = 1 Ensuite, récupérez une correspondance spécifique enregistrements.
5 Réponses :
Vous pouvez essayer comme ci-dessous
WHERE (
isnull(@UserRoleID, 0) = 1
OR (
isnull(@UserRoleID, 0) <> 1
AND dbo.TableName.UserRole = @UserRoleID
)
)
Vous pouvez utiliser la logique booléenne à la place:
where (@UserRoleID = 1) OR
(@UserRoleID <> 1 AND UserRole = @UserRoleID);
Vous pouvez opter pour la logique IF ELSE. Même s'il a l'air plus long, il a l'air plus propre.
DECLARE @UserRoleID INT =3
IF @UserRoleID = 1 -- admin
BEGIN
SELECT
urp.id AS 'iD',
canview AS 'read',
cancreate AS 'create',
canedit AS 'update',
candelete AS 'delete',
ur.description AS 'userRole',
ch.description AS 'rightsToMenu',
urp.creator AS 'creator',
urp.datecreated AS 'dateCreated',
urp.datemodified AS 'dateModified',
urp.modifier AS 'modifier'
FROM userrolepermission AS urp
INNER JOIN userrole AS ur
ON urp.userroleid = ur.id
INNER JOIN channel AS ch
ON urp.channelid = ch.id
END
ELSE
BEGIN
SELECT
urp.id AS 'iD',
canview AS 'read',
cancreate AS 'create',
canedit AS 'update',
candelete AS 'delete',
ur.description AS 'userRole',
ch.description AS 'rightsToMenu',
urp.creator AS 'creator',
urp.datecreated AS 'dateCreated',
urp.datemodified AS 'dateModified',
urp.modifier AS 'modifier'
FROM userrolepermission AS urp
INNER JOIN userrole AS ur
ON urp.userroleid = ur.id
INNER JOIN channel AS ch
ON urp.channelid = ch.id
WHERE urp.UserRoleID = @UserRoleID
END
Merci mec, peut aller avec cela aussi, mais pas souhaité dans mon cas.
a utilisé ce code ...
WHERE urp.UserRoleID IN((CASE WHEN @UserRoleID = 1 THEN ('2') ELSE CAST(@UserRoleID AS NVARCHAR) END))
UserRoleID = 3 record obtenir ce code utilement
Vous pouvez simplement utiliser Dynamic SQL.
DECLARE @query NVARCHAR(MAX)
SET @query='SELECT urp.id AS [iD]
,canview AS [read]
,cancreate AS [create]
,canedit AS [update]
,candelete AS [delete]
,ur.description AS [userRole]
,ch.description AS [rightsToMenu]
,urp.creator AS [creator]
,urp.datecreated AS [dateCreated]
,urp.datemodified AS [dateModified]
,urp.modifier AS [modifier]
FROM userrolepermission urp
INNER JOIN userrole ur ON urp.userroleid = ur.id
INNER JOIN channel AS ch ON urp.channelid = ch.id '
IF @UserRoleID=1
BEGIN
SET @query += ' your condition'
END
ELSE
BEGIN
SET @query += ' your condition'
end
EXECUTE @query