none
Where dinâmico RRS feed

  • 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.

    quarta-feira, 4 de outubro de 2006 20:59

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

    quinta-feira, 5 de outubro de 2006 11:38

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;

    quinta-feira, 5 de outubro de 2006 10:17
  • 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

    quinta-feira, 5 de outubro de 2006 11:38