Usuário com melhor resposta
Where dinâmico

Pergunta
-
Olá pessoal,
Preciso montar uma query com o WHERE dinâmico. Tenho uma solução que funciona legal, onde monto a instrução SQL dentro da SP e depois dou um EXEC. Mas, segundo informações, o EXEC não é recomendado devido a baixa performance. Isso é verdade? Qual(is) o(s) problema(s) de usar um EXEC em uma instrução SQL ao invés de um SELECT direto, por exemplo?
Seguindo esta premissa de não usar o EXEC, tentei fazer algo como abaixo:
CREATE PROCEDURE GG_SP_MANAGER_USUARIOS_EXISTS
@Email AS Varchar(100),
@Usuario AS Decimal(18,0)
AS
SELECT
GG_MANAGER_USUARIOS.Usuario
FROM
GG_MANAGER_USUARIOS
WHERE
UPPER(LTRIM(RTRIM(GG_MANAGER_USUARIOS.Email)))=@Email
CASE WHEN @Usuario >0 THEN AND GG_MANAGER_USUARIOS.Usuario<>@Usuario END
GO* o SELECT será executado verificando ou não o código do usuário passado (>0). É aqui que entra a condicional.
Porém está dando o erro:
Server: Msg 156, Level 15, State 1, Procedure GG_SP_MANAGER_USUARIOS_EXISTS, Line 11
Incorrect syntax near the keyword 'CASE'.Alguém pode me ajudar? Alguma sugestão melhor?
Grato.
Respostas
-
Ramon,
Normalmente o comando Case não é declarado declarado desta forma na claúscula Where, você já tentou fazer assim.
Veja o exemplo, sem levar em consideração qualquer regra de negócio ou estrutura do seus dados e tables.
CREATE PROCEDURE GG_SP_MANAGER_USUARIOS_EXISTS
@Email AS Varchar(100),
@Usuario AS Decimal(18,0)
AS
SELECT GG_MANAGER_USUARIOS.Usuario FROM GG_MANAGER_USUARIOS
WHERE UPPER(LTRIM(RTRIM(GG_MANAGER_USUARIOS.Email)))=@Email
And @Usuario >0
AND GG_MANAGER_USUARIOS.Usuario <> @Usuario END
Todas as Respostas
-
o case nao funciona bem no where, mais veja se e +- isso que vc. quer
CREATE PROCEDURE GG_SP_MANAGER_USUARIOS_EXISTS
@Email AS Varchar(100),
@Usuario AS Decimal(18,0)
AS
SELECT GG_MANAGER_USUARIOS.Usuario
FROM GG_MANAGER_USUARIOS
WHERE UPPER(LTRIM(RTRIM(GG_MANAGER_USUARIOS.Email)))= @Email And
GG_MANAGER_USUARIOS.Email = Case When @usuario > 0 Then GG_MANAGER_USUARIOS.Email End
As;
-
Ramon,
Normalmente o comando Case não é declarado declarado desta forma na claúscula Where, você já tentou fazer assim.
Veja o exemplo, sem levar em consideração qualquer regra de negócio ou estrutura do seus dados e tables.
CREATE PROCEDURE GG_SP_MANAGER_USUARIOS_EXISTS
@Email AS Varchar(100),
@Usuario AS Decimal(18,0)
AS
SELECT GG_MANAGER_USUARIOS.Usuario FROM GG_MANAGER_USUARIOS
WHERE UPPER(LTRIM(RTRIM(GG_MANAGER_USUARIOS.Email)))=@Email
And @Usuario >0
AND GG_MANAGER_USUARIOS.Usuario <> @Usuario END