Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Claudio Andrade

[Resolvido] Erro em Função de retorno de Tabela

Recommended Posts

Prezados,

 

Tenho essa função que há uma declaração de variável, ao executar o script a mesma retorna erro, o motivo da criação dessa variável é devido ao critério da mesma, pois na chamada da função posso ou não passar o valor. Minha intenção é utilizar a mesma função e não criar uma outra com este argumento no where.

 

CREATE FUNCTION [DBO].[CWA_FIN_QUERY_ASSINATURA_TIPO2]
(
@CD_CONTABIL_PESSOA		INT,
@NU_CTR				INT,
@NU_DV_CTR			SMALLINT,
@NU_SERIE_CTR			VARCHAR(1),
@NU_RECIBO_VA			INT,
@NU_DV				SMALLINT
) RETURNS TABLE
AS BEGIN 
	DECLARE @EXECUTE VARCHAR(4000)

	SET @EXECUTE = 'SELECT '
	SET @EXECUTE = @EXECUTE + 'PA.NU_PERIODO, '
	SET @EXECUTE = @EXECUTE + 'CA.CD_PRODUTO, '
	SET @EXECUTE = @EXECUTE + '''0'' AS CD_ITEM_PRODUTO, '
	SET @EXECUTE = @EXECUTE + 'ISNULL(CP.NU_CPF,0) AS CPF_CLIENTE, '
	SET @EXECUTE = @EXECUTE + 'ISNULL(CP.NU_CNPJ,0) AS CNPJ_CLIENTE, '
	SET @EXECUTE = @EXECUTE + 'TP.CD_TP_PAGAMENTO, '
	SET @EXECUTE = @EXECUTE + 'RA.VA_RECIBO, '
	SET @EXECUTE = @EXECUTE + 'PA.VA_PLANO, '
	SET @EXECUTE = @EXECUTE + 'ISNULL(RA.VA_DESCONTO,0) AS VA_DESCONTO, '
	SET @EXECUTE = @EXECUTE + 'RA.VA_DIVIDA_AGREG, '
	SET @EXECUTE = @EXECUTE + 'RA.DT_EMISSAO, '
	SET @EXECUTE = @EXECUTE + 'P.CD_GRUPO_FISCAL, '
	SET @EXECUTE = @EXECUTE + 'P.CD_MATERIAL_ASSOCIADO, '
	SET @EXECUTE = @EXECUTE + 'RA.CD_LOCAL_PAG, '
	SET @EXECUTE = @EXECUTE + 'ISNULL(CP1.NU_CPF,0) AS CPF_PORTADOR, '
	SET @EXECUTE = @EXECUTE + 'ISNULL(CP1.NU_CNPJ,0) AS CNPJ_PORTADOR, '
	SET @EXECUTE = @EXECUTE + 'RA.NU_PARCELA, '
	SET @EXECUTE = @EXECUTE + 'CAST(RA.NU_RECIBO AS VARCHAR) + ''-'' + CAST(RA.NU_DV AS VARCHAR) + ''/'' + CAST(RA.NU_PARCELA AS VARCHAR) AS NU_RECIBO '
	SET @EXECUTE = @EXECUTE + 'FROM '
	SET @EXECUTE = @EXECUTE + 'CONTRATO_ASSINANTE CA '
	SET @EXECUTE = @EXECUTE + 'INNER JOIN PLANO_COMERCIAL PC	ON	CA.CD_PLANO				=	PC.CD_PLANO '
	SET @EXECUTE = @EXECUTE + 'INNER JOIN FORMA_PAGAMENTO FP	ON	FP.CD_FORMA_PAG			=	PC.CD_FORMA_PAG '
	SET @EXECUTE = @EXECUTE + 'INNER JOIN TIPO_PAGAMENTO TP	ON	TP.CD_TP_PAGAMENTO		=	FP.CD_TP_PAGAMENTO '
	SET @EXECUTE = @EXECUTE + 'INNER JOIN CADASTRO_PESSOA CP	ON	CA.CD_CONTABIL_PESSOA	=	CP.CD_CONTABIL_PESSOA '
	SET @EXECUTE = @EXECUTE + 'INNER JOIN PRODUTO P			ON	CA.CD_PRODUTO			=	P.CD_PRODUTO '
	SET @EXECUTE = @EXECUTE + 'INNER JOIN PERIODO_ASSINANTE PA ON	PA.CD_CONTABIL_PESSOA	=	CA.CD_CONTABIL_PESSOA AND '
	SET @EXECUTE = @EXECUTE + '									PA.NU_PERIODO			=	CA.NU_PERIODO_ATUAL AND '
	SET @EXECUTE = @EXECUTE + '									PA.NU_CTR				=	CA.NU_CTR AND '
	SET @EXECUTE = @EXECUTE + '									PA.NU_DV_CTR			=	CA.NU_DV_CTR AND '
	SET @EXECUTE = @EXECUTE + '									PA.NU_SERIE_CTR			=	CA.NU_SERIE_CTR '
	SET @EXECUTE = @EXECUTE + 'INNER JOIN RECIBO_ASSINANTE RA	ON	RA.CD_CONTABIL_PESSOA	=	PA.CD_CONTABIL_PESSOA AND '
	SET @EXECUTE = @EXECUTE + '									RA.NU_PERIODO			=	PA.NU_PERIODO AND '
	SET @EXECUTE = @EXECUTE + '									RA.NU_CTR				=	PA.NU_CTR AND '
	SET @EXECUTE = @EXECUTE + '									RA.NU_DV_CTR			=	PA.NU_DV_CTR AND '
	SET @EXECUTE = @EXECUTE + '									RA.NU_SERIE_CTR			=	PA.NU_SERIE_CTR AND '
	SET @EXECUTE = @EXECUTE + '									RA.NU_RECIBO			=	PA.NU_RECIBO '
	SET @EXECUTE = @EXECUTE + 'INNER JOIN CADASTRO_PESSOA CP1	ON	CP1.CD_CONTABIL_PESSOA	=	RA.CD_LOCAL_PAG '
	SET @EXECUTE = @EXECUTE + 'WHERE '
	SET @EXECUTE = @EXECUTE + 'CA.CD_CONTABIL_PESSOA = ' + CAST(@CD_CONTABIL_PESSOA AS VARCHAR)
	SET @EXECUTE = @EXECUTE + ' AND CA.NU_CTR = ' + CAST(@NU_CTR AS VARCHAR)
	SET @EXECUTE = @EXECUTE + ' AND CA.NU_DV_CTR = ' + CAST(@NU_DV_CTR AS VARCHAR)
	SET @EXECUTE = @EXECUTE + ' AND CA.NU_SERIE_CTR = ' + @NU_SERIE_CTR
	SET @EXECUTE = @EXECUTE + ' AND RA.NU_RECIBO = ' + CAST(@NU_RECIBO_VA AS VARCHAR)

	IF ISNULL(@NU_DV,0) <> 0 BEGIN
		SET @EXECUTE = @EXECUTE + ' AND RA.NU_DV = ' + CAST(@NU_DV AS VARCHAR)
	END

	RETURN	EXEC (@EXECUTE)
END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezados,

 

Obrigado a todos que visualizaram! Resolvi o problema da função, de fato o tipo de função TABLE-VALUED não aceita programação como fazemos em procedure, então utilizei um outro padrão que é parecida com SCALAR-FUNCTION, porem com retorno de TABELA, o nome desse tipo é MULTI-STATEMENT TABLE-VALUED, segue o exemplo para futuras consultas:

CREATE FUNCTION [DBO].[FUNC_MULTI_STATEMENT]
(
@CAMPO1		INT,
@CAMPO2		INT,
@CAMPO3		SMALLINT,
@CAMPO4	        VARCHAR(1),
@CAMPO5		INT,
@CAMPO6		SMALLINT,
@CAMPO7		SMALLINT
)
RETURNS @TABELA TABLE
(
CAMPO_TAB1	SMALLINT	NULL,
CAMPO_TAB2	SMALLINT	NULL,
CAMPO_TAB3	SMALLINT	NULL,
CAMPO_TAB4	BIGINT		NULL,
CAMPO_TAB5	BIGINT		NULL,
CAMPO_TAB6	SMALLINT	NULL,
CAMPO_TAB7	MONEY		NULL,
CAMPO_TAB8	MONEY		NULL,
CAMPO_TAB9	MONEY		NULL,
CAMPO_TAB10	MONEY		NULL,
CAMPO_TAB11	SMALLDATETIME	NULL,
CAMPO_TAB12	SMALLINT	NULL,
CAMPO_TAB13	SMALLINT	NULL,
CAMPO_TAB14	INT		NULL,
CAMPO_TAB15	BIGINT		NULL,
CAMPO_TAB16	BIGINT		NULL,
CAMPO_TAB17	SMALLINT	NULL,
CAMPO_TAB18	VARCHAR(20)	NULL
)
AS BEGIN
IF ISNULL(@CAMPO7,0) = 0 BEGIN
	INSERT INTO @TABELA
		SELECT
		TA1.CAMPO_TAB_REAL1,
		TA1.CAMPO_TAB_REAL2,
		TA1.CAMPO_TAB_REAL3,
                       (...)
		FROM
		TABELA1 TA1
		INNER JOIN TABELA2 TA2 ON TA1.CAMPO_TAB_REAL1 =	TA2.CAMPO_TAB_REAL1
                       (...)
                       WHERE
		(...)
END

ELSE BEGIN
	INSERT INTO @TABELA
		SELECT
		TA1.CAMPO_TAB_REAL1,
		TA1.CAMPO_TAB_REAL2,
		TA1.CAMPO_TAB_REAL3,
                       (...)
		FROM
		TABELA1 TA1
		INNER JOIN TABELA2 TA2 ON TA1.CAMPO_TAB_REAL1 =	TA2.CAMPO_TAB_REAL1
                       (...)
                       WHERE
		(...)
		AND TA3.CAMPO_TAB_REAL7 = @CAMPO7
END

RETURN
END

 

Nesse caso o código foi repetido dentro da própria função, com o acréscimo do critério da clausula WHERE, infelizmente o EXECUTE @PARAM não funciona, mais acho que isso pode ajudar a alguns dependendo da necessidade.

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.