none
Erro em procedure de update com CASE RRS feed

  • Pergunta

  • Estou tentando criar uma procedure de update mas que só atualiza em determinadas siatuações, mas estou obtendo erro, minha procedure:

    CREATE PROCEDURE [dbo].[ATUALIZAR_APROVADO] 
    	@REGISTRO_DT SMALLDATETIME,
    	@ATIVIDADE_ID INT,
    	@RESULTADO_ID INT,
    	@APROVADO BIT
    AS
    BEGIN
    	UPDATE REGISTRO 
    			SET APROVADO_BLN = (
    				CASE WHEN APROVADO_BLN <> @APROVADO
    					 THEN APROVADO_BLN = @APROVADO
    					  AND DATA_REGISTRO = CAST(GETDATE() AS SMALLDATETIME)
    				END)
    	WHERE REGISTRO_ID = @REGISTRO_ID
    	  AND ATIVIDADE_ID = @ATIVIDADE_ID
    	  AND RESULTADO_ID = @RESULTADO_ID 
    END
    GO
    

    Somente se situação de aprovado for diferente da que está no banco deve-se atualizar a situação e gravar a data de registro.

    Recebo esse erro: 

    Msg 170, Level 15, State 1, Procedure ATUALIZAR_APROVADO, Line 14
    Line 14: Incorrect syntax near '='.
    quarta-feira, 13 de março de 2013 12:50

Todas as Respostas

  • Shatemui,

    Tente desta forma

    CREATE PROCEDURE [dbo].[ATUALIZAR_APROVADO] 
    @REGISTRO_DT SMALLDATETIME,
    @ATIVIDADE_ID INT,
    @RESULTADO_ID INT,
    @APROVADO BIT,
    @REGISTRO_ID INT
    AS
    BEGIN
    UPDATE REGISTRO 
    SET 
    APROVADO_BLN = 
    CASE 
    WHEN APROVADO_BLN <> @APROVADO
    THEN @APROVADO
    ELSE APROVADO_BLN END,
    DATA_REGISTRO = 
    CASE 
    WHEN APROVADO_BLN <> @APROVADO
    THEN CAST(GETDATE() AS SMALLDATETIME)
    ELSE DATA_REGISTRO END
    WHERE REGISTRO_ID = @REGISTRO_ID
     AND ATIVIDADE_ID = @ATIVIDADE_ID
     AND RESULTADO_ID = @RESULTADO_ID 
    END
    GO


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 13 de março de 2013 12:55
    Moderador
  • Bom dia, pelo que vi voce não esta utilizando um case para fazer diversas seleções/critérios, esta sendo somente um filtro, por que voce não coloca isto como um filtro no where que funcionaria como voce quer ? ex:

    CREATE PROCEDURE [dbo].[ATUALIZAR_APROVADO] 
    	@REGISTRO_DT SMALLDATETIME,
    	@ATIVIDADE_ID INT,
    	@RESULTADO_ID INT,
    	@APROVADO BIT
    AS
    BEGIN
    	UPDATE REGISTRO 
    			SET APROVADO_BLN = @APROVADO 
    	WHERE REGISTRO_ID = @REGISTRO_DT
    	  AND ATIVIDADE_ID = @ATIVIDADE_ID
    	  AND RESULTADO_ID = @RESULTADO_ID 
    	  AND APROVADO_BLN <> @APROVADO
    	  AND DATA_REGISTRO = CAST(GETDATE() AS SMALLDATETIME)
    END
    GO


    Alexandre Matayosi Conde Mauricio.

    quarta-feira, 13 de março de 2013 13:00
  • Vlw, funcionou, não deu erros, agora só testar para ver se vai fazer o que preciso.
    quarta-feira, 13 de março de 2013 13:03
  • Bom dia, pelo que vi voce não esta utilizando um case para fazer diversas seleções/critérios, esta sendo somente um filtro, por que voce não coloca isto como um filtro no where que funcionaria como voce quer ? ex:

    CREATE PROCEDURE [dbo].[ATUALIZAR_APROVADO] 
    	@REGISTRO_DT SMALLDATETIME,
    	@ATIVIDADE_ID INT,
    	@RESULTADO_ID INT,
    	@APROVADO BIT
    AS
    BEGIN
    	UPDATE REGISTRO 
    			SET APROVADO_BLN = @APROVADO 
    	WHERE REGISTRO_ID = @REGISTRO_DT
    	  AND ATIVIDADE_ID = @ATIVIDADE_ID
    	  AND RESULTADO_ID = @RESULTADO_ID 
    	  AND APROVADO_BLN <> @APROVADO
    	  AND DATA_REGISTRO = CAST(GETDATE() AS SMALLDATETIME)
    END
    GO


    Alexandre Matayosi Conde Mauricio.

    o campo data é nulo, só recebe valor se a situação de aprovado mudar, na sua query ela está sendo usa como uma cláusula.
    quarta-feira, 13 de março de 2013 13:34
  • Entendi, tente da maneira abaixo, veja que só vai ter alteração se APROVADO_BLN <> @APROVADO:

    CREATE PROCEDURE [dbo].[ATUALIZAR_APROVADO] 
    	@REGISTRO_DT SMALLDATETIME,
    	@ATIVIDADE_ID INT,
    	@RESULTADO_ID INT,
    	@APROVADO BIT
    AS
    BEGIN
    	UPDATE REGISTRO 
    		SET APROVADO_BLN = @APROVADO,
                       DATA_REGISTRO = CAST(GETDATE() AS SMALLDATETIME)
      
    	WHERE REGISTRO_ID = @REGISTRO_DT
    	  AND ATIVIDADE_ID = @ATIVIDADE_ID
    	  AND RESULTADO_ID = @RESULTADO_ID 
    	  AND APROVADO_BLN <> @APROVADO
    END
    GO


    Alexandre Matayosi Conde Mauricio.

    quarta-feira, 13 de março de 2013 13:55