Reputation: 3521
I'm writing a stored procedure that runs different selects based on the user role , this is just an example to showcase my intention since i have a lot of roles to work with.
IF OBJECT_ID('dbo.spSelectArtigos') IS NOT NULL
DROP PROCEDURE spSelectArtigos
GO
CREATE PROCEDURE spSelectArtigos
@IdUser int,
@Acesso nvarchar(20)
AS
BEGIN
IF(@Acesso = 'User')
SELECT col1,col2 from table1 where IdUser = @IdUser
IF(@Acesso = 'Logistica')
SELECT col1,col2,col3 from table1 where IdUser = @IdUser
IF(@Acesso = 'Admin')
SELECT * From table1
END
Is there a more effective way to do this with less code using some sort of logic?
Upvotes: 0
Views: 800
Reputation: 15155
Here is a kludgy way but it is concise.
IF OBJECT_ID('dbo.spSelectArtigos') IS NOT NULL
DROP PROCEDURE spSelectArtigos
GO
CREATE PROCEDURE spSelectArtigos
@IdUser int,
@Acesso nvarchar(20)
AS
BEGIN
DECLARE @Result TABLE(A INT,B INT,C INT,D INT)
INSERT @Result SELECT A,B,C,D FROM table1 WHERE idUser=@idUser
IF(@Acesso = 'User')
UPDATE @Result SET C=NULL, D=NULL
IF(@Acesso = 'Logistica')
UPDATE @Result SET D=NULL
SELECT * From @Result
END
Another way but dealing with ID's
SELECT
A=CASE WHEN @Acesso >= 10 THEN A ELSE NULL END,
B=CASE WHEN @Acesso >= 20 THEN B ELSE NULL END,
C=CASE WHEN @Acesso >= 99 THEN C ELSE NULL END
FROM
table1
WHERE
idUser=@idUser
Upvotes: 1
Reputation: 7107
IDK why i added a check to make sure the user actually exists but it isnt a bad idea
IF OBJECT_ID('dbo.spSelectArtigos') IS NOT NULL
DROP PROCEDURE spSelectArtigos
GO
CREATE PROCEDURE spSelectArtigos
@IdUser int,
@Acesso nvarchar(20)
AS
BEGIN
CASE
WHEN @Acesso ='User'
AND
EXISTS (SELECT * FROM table1 WHERE IdUser = @IdUser)
THEN
SELECT col1,col2 from table1 where IdUser = @IdUser
WHEN @Acesso ='Logistica' Then
AND
EXISTS (SELECT * FROM table1 WHERE IdUser = @IdUser)
THEN
SELECT col1,col2,col3 from table1 where IdUser = @IdUser
WHEN @Acesso ='Admin'
AND
EXISTS (SELECT * FROM table1 WHERE IdUser = @IdUser)
THEN
SELECT * From table1
END
END
Upvotes: 1