none
IF com falha em uma procedure sql server 2005 RRS feed

  • Pergunta

  • ALTER PROCEDURE PROC_LISTCARTOES
    @CODCLI VARCHAR(5),@STATUS VARCHAR(2),@NOME VARCHAR(30)

    AS

    SELECT  U.CODCRT AS CARTAO, DATSTA as DATA_STATUS, U.CPF,
            U.NOMUSU AS NOME, U.NUMDEP AS TD, S.DESTA AS STATUS
    FROM USUARIOVA U
            INNER JOIN STATUS S ON S.STA = U.STA
    WHERE U.CODCLI = @CODCLI

    IF @NOME IS NOT NULL
       AND U.NOMUSU LIKE ''+@NOME+'%'

    IF @STATUS IS NOT NULL
        AND U.STA =@STATUS

    ORDER BY LTRIM(U.NOMUSU)

    Pessoal bom dia,

    estou tendo problemas para montar essa procedure, hoje ela me acusa o erro abaixo

    Msg 156, Level 15, State 1, Procedure PROC_LISTCARTOES, Line 18
    Incorrect syntax near the keyword 'ORDER'.

    So que sei que o erro esta nos IF, como faço para que ela funcione dessa forma?

           
    quinta-feira, 29 de agosto de 2013 13:45

Respostas

  • Bom dia,

    Acho que você conseguira obter o resultado desejado com a clausula Where da seguinte forma:

    WHERE 
        U.CODCLI = @CODCLI and
        (@NOME IS NULL or U.NOMUSU LIKE @NOME + '%') and
        (@STATUS IS NULL or U.STA = @STATUS)
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta DouglasAmFm quinta-feira, 29 de agosto de 2013 14:15
    quinta-feira, 29 de agosto de 2013 13:52
  • Olá Douglas,

    para este caso terás que utilizar sql dinâmico.]

    ALTER PROCEDURE PROC_LISTCARTOES 
    @CODCLI VARCHAR(5),@STATUS VARCHAR(2),@NOME VARCHAR(30)

    AS
    declare @query nvarchar(max)

    set @query = '
    SELECT  U.CODCRT AS CARTAO, DATSTA as DATA_STATUS, U.CPF, 
    U.NOMUSU AS NOME, U.NUMDEP AS TD, S.DESTA AS STATUS 
    FROM USUARIOVA U 
    INNER JOIN STATUS S ON S.STA = U.STA 
    WHERE U.CODCLI =  ''' + @CODCLI + ''''

    IF @NOME IS NOT NULL
    begin
      set @query = @query + ' AND U.NOMUSU LIKE '''+ @NOME +'%'''
    end
    IF @STATUS IS NOT NULL 
    begin    
    set @query = @query + ' AND U.STA = ''' + @STATUS + ''''
    end
    set @query = @query + ' ORDER BY LTRIM(U.NOMUSU)'

    exec sp_executesql @query

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão

    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |


    • Sugerido como Resposta Roberto Galvão quinta-feira, 29 de agosto de 2013 13:51
    • Editado Roberto Galvão quinta-feira, 29 de agosto de 2013 13:52
    • Marcado como Resposta DouglasAmFm quinta-feira, 29 de agosto de 2013 13:52
    quinta-feira, 29 de agosto de 2013 13:50

Todas as Respostas

  • Olá Douglas,

    para este caso terás que utilizar sql dinâmico.]

    ALTER PROCEDURE PROC_LISTCARTOES 
    @CODCLI VARCHAR(5),@STATUS VARCHAR(2),@NOME VARCHAR(30)

    AS
    declare @query nvarchar(max)

    set @query = '
    SELECT  U.CODCRT AS CARTAO, DATSTA as DATA_STATUS, U.CPF, 
    U.NOMUSU AS NOME, U.NUMDEP AS TD, S.DESTA AS STATUS 
    FROM USUARIOVA U 
    INNER JOIN STATUS S ON S.STA = U.STA 
    WHERE U.CODCLI =  ''' + @CODCLI + ''''

    IF @NOME IS NOT NULL
    begin
      set @query = @query + ' AND U.NOMUSU LIKE '''+ @NOME +'%'''
    end
    IF @STATUS IS NOT NULL 
    begin    
    set @query = @query + ' AND U.STA = ''' + @STATUS + ''''
    end
    set @query = @query + ' ORDER BY LTRIM(U.NOMUSU)'

    exec sp_executesql @query

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão

    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |


    • Sugerido como Resposta Roberto Galvão quinta-feira, 29 de agosto de 2013 13:51
    • Editado Roberto Galvão quinta-feira, 29 de agosto de 2013 13:52
    • Marcado como Resposta DouglasAmFm quinta-feira, 29 de agosto de 2013 13:52
    quinta-feira, 29 de agosto de 2013 13:50
  • Bom dia,

    Acho que você conseguira obter o resultado desejado com a clausula Where da seguinte forma:

    WHERE 
        U.CODCLI = @CODCLI and
        (@NOME IS NULL or U.NOMUSU LIKE @NOME + '%') and
        (@STATUS IS NULL or U.STA = @STATUS)
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta DouglasAmFm quinta-feira, 29 de agosto de 2013 14:15
    quinta-feira, 29 de agosto de 2013 13:52
  • Roberto muito obrigado pela resposta, funcionou  :)
    quinta-feira, 29 de agosto de 2013 13:53
  • Gapimex sua forma também funciona ... valeu
    quinta-feira, 29 de agosto de 2013 14:16