O que tem de errado nesta função SQL?

04/12/2023

0

Olá pessoal,

Estou tentando criar a função abaixo para que seja retornado o salário líquido do funcionário:

CREATE OR ALTER FUNCTION fnSALARIO_LIQUIDO (
	@ANOCOMP_N AS INTEGER,
	@MESCOMP_N AS INTEGER,
	@NROPERIODO_N AS INTEGER,
	@CHAPA_S AS VARCHAR(20)
) RETURNS DECIMAL(18,4)
AS
BEGIN
	DECLARE @RETORNO AS DECIMAL(18,4)

	SET @RETORNO = (SELECT (ISNULL((SELECT SUM(X.VALOR) FROM PFFINANC X (NOLOCK)
                        INNER JOIN PEVENTO Y ON (Y.CODIGO = X.CODEVENTO AND Y.CODCOLIGADA = X.CODCOLIGADA)
                        WHERE X.CHAPA = A.CHAPA AND
                        X.ANOCOMP = @ANOCOMP_N AND X.MESCOMP = @MESCOMP_N AND X.NROPERIODO = @NROPERIODO_N
                        AND Y.PROVDESCBASE = ''P''), 0)
                        
                    -  ISNULL((SELECT SUM(X.VALOR) FROM PFFINANC X (NOLOCK)
                        INNER JOIN PEVENTO Y ON (Y.CODIGO = X.CODEVENTO AND Y.CODCOLIGADA = X.CODCOLIGADA)
                        WHERE X.CHAPA = A.CHAPA AND
                        X.ANOCOMP = @ANOCOMP_N AND X.MESCOMP = @MESCOMP_N AND X.NROPERIODO = @NROPERIODO_N
                        AND Y.PROVDESCBASE = ''D''), 0))
					FROM PFUNC A
					WHERE A.CHAPA = @CHAPA_S)
END

GO

SELECT A.CHAPA, A.NOME, SALARIO_LIQUIDO = dbo.fnSALARIO_LIQUIDO(2023, 11, 1, A.CHAPA)
FROM PFUNC A
WHERE A.CHAPA = ''00802''



Só que está retornando o erro:
Msg 455, Nível 16, Estado 2, Procedimento fnSALARIO_LIQUIDO, Linha 11 [Linha de Início do Lote 0]
The last statement included within a function must be a return statement.
Mensagem 4121, Nível 16, Estado 1, Linha 28
Cannot find either column "dbo" or the user-defined function or aggregate "dbo.fnSALARIO_LIQUIDO", or the name is ambiguous.

Como posso corrigir isso?

Grato.
Ilano Caldas

Ilano Caldas

Responder

Post mais votado

04/12/2023

Como a mensagem de erro informa, claramente, quando definimos uma function, temos que retornar o valor que a function gera.

Imagino que tenha faltado apenas informar isso, acrescentando uma linha antes do END:

  ...
  return @retorno
END

Arthur Heinrich

Arthur Heinrich
Responder

Mais Posts

05/12/2023

Ilano Caldas

Como a mensagem de erro informa, claramente, quando definimos uma function, temos que retornar o valor que a function gera.

Imagino que tenha faltado apenas informar isso, acrescentando uma linha antes do END:

  ...
  return @retorno
END



Caramba, que barbeiragem a minha! Era isso mesmo Arthur.
Obrigado!
Responder

05/12/2023

Fernando Gaspar

Boooa as vezes os detalhes passam desapercebidos..
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar