Pergunta

Estou alterando function como:

ALTER FUNCTION [dbo].[fn_CalculateListing](@Listing TypeListingDatePrice READONLY)
RETURNS TypePreviousListingResult 
AS 
BEGIN
    DECLARE @tbl_ListingDateDetails TypePreviousListingResult   
    RETURN @tbl_ListingDateDetails
END
GO

Mas jogando erro como:

Msg 137, Level 16, State 1, Procedure fn_CalculateListing, Line 6
Must declare the scalar variable "@tbl_ListingDateDetails".

Por que está dando erro e pedindo declaração mesmo tendo declarado isso antes de usar essa variável?

TypePreviousListingResult é um tipo de tabela criado como CREATE TYPE TypePreviousListingResult AS TABLE....

Pergunta anterior: Como escrever uma função em sql que aceite a tabela como entrada e retorne o resultado como tabela?

Foi útil?

Solução

Existem dois problemas aqui:

  1. Para TVFs de várias instruções, você só precisa de RETURN; em vez de RETURN @variable;.

  2. Não parece que você pode usar um tipo de tabela definido pelo usuário (UDTT) como o tipo de tabela de retorno.Isso precisará ser especificado explicitamente (ou seja, cada nome de coluna e tipo de dados).

Se fosse uma UDF escalar, a sintaxe de especificar apenas o nome do tipo de dados na cláusula RETURNS e especificar o nome da variável na instrução RETURN estaria correta.No entanto, você não pode retornar tipos TABLE (ou CURSOR) de uma UDF escalar.

Consulte a página do MSDN para CRIAR FUNÇÃO para obter mais detalhes.

Você vai precisar de algo como:

ALTER FUNCTION [dbo].[fn_CalculateListing]
(
  @Listing dbo.TypeListingDatePrice READONLY
)
RETURNS @ListingDateDetails TABLE (ColumnName DataType,...)
AS 
BEGIN
    -- Do stuffs

    RETURN;
END;
GO

Para uma discussão mais ampla das técnicas disponíveis para passar conjuntos de linhas, consulte: Como compartilhar dados entre procedimentos armazenados por Erland Sommarskog.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a dba.stackexchange
scroll top