Obtendo o erro "deve declarar a variável escalar" na função SQL mesmo que ela seja declarada
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?
Solução
Existem dois problemas aqui:
Para TVFs de várias instruções, você só precisa de
RETURN;
em vez deRETURN @variable;
.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.