即使已声明,在 SQL 函数中出现错误“必须声明标量变量”

Kai*_*shu 5 sql-server sql-server-2012 functions user-defined-table-type table-valued-parameters

我正在改变function

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

但抛出错误为:

Msg 137, Level 16, State 1, Procedure fn_CalculateListing, Line 6
Must declare the scalar variable "@tbl_ListingDateDetails".
Run Code Online (Sandbox Code Playgroud)

即使我在使用该变量之前已经声明过,为什么会出现错误并要求声明?

TypePreviousListingResult 是创建为 的表类型CREATE TYPE TypePreviousListingResult AS TABLE...

上一个问题:如何在sql中编写接受表作为输入并将结果作为表返回的函数?

Sol*_*zky 11

这里有两个问题:

  1. 对于多语句TVFs,你只需要RETURN;代替RETURN @variable;

  2. 您似乎无法使用用户定义的表类型 (UDTT) 作为返回表类型。这将需要明确指定(即每个列名和数据类型)。

如果这是一个标量 UDF,那么在RETURNS子句中仅指定数据类型名称并在语句中指定变量名称的语法RETURN将是正确的。但是,您不能从标量 UDF返回TABLE(或CURSOR)类型。

有关更多详细信息,请参阅CREATE FUNCTION的 MSDN 页面。

您将需要以下内容:

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

    RETURN;
END;
GO
Run Code Online (Sandbox Code Playgroud)

有关传递行集的可用技术的更广泛讨论,请参阅:如何在存储过程之间共享数据by Erland Sommarskog