Inquiridor
Erro em procedure de update com CASE

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 '='.
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
GOFabrizzio 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 -
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.
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 13 de março de 2013 19:20
-
-
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.
-
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.
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 13 de março de 2013 19:21