SQL Server 2008表变量错误:必须声明标量变量"@“结果”;

SQL Server 2008表变量错误:必须声明标量变量"@“结果”;,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我第一次在SQLServer2008中将表值用作函数的参数。下面的代码会产生此错误: 必须声明标量变量“@RESULT” 为什么?!我在函数的第一行声明它 ALTER FUNCTION f_Get_Total_Amount_Due( @CUSTOMER_LIST [tpCSFM_CUSTOMER_SET_FOR_MONEY] READONLY ) RETURNS [tpCSFM_CUSTOMER_SET_FOR_MONEY] AS

我第一次在SQLServer2008中将表值用作函数的参数。下面的代码会产生此错误:

必须声明标量变量“@RESULT”

为什么?!我在函数的第一行声明它

        ALTER FUNCTION f_Get_Total_Amount_Due(

      @CUSTOMER_LIST   [tpCSFM_CUSTOMER_SET_FOR_MONEY] READONLY

    )
    RETURNS [tpCSFM_CUSTOMER_SET_FOR_MONEY]
    AS
    BEGIN


 --Prepare the return value, start with initial customer list
 DECLARE @RESULT AS [tpCSFM_CUSTOMER_SET_FOR_MONEY]
 INSERT INTO @RESULT SELECT * FROM @CUSTOMER_LIST

 --Todo: populate with real values
 UPDATE @RESULT SET tpCSAM_MONEY_VALUE = 100

 --return total amounts as currency
 RETURN @RESULT

 END
使返回值能够是用户定义的表类型

但是,您可以尝试:返回@RESULT[tpCSFM\u CUSTOMER\u SET\u FOR\u MONEY]并删除单独的声明


当我有机会设置测试用例时,我需要检查它。

您的声明将属于“多语句表值函数”情况:

Multistatement Table-valued Functions
CREATE FUNCTION [ schema_name. ] function_name 
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type 
    [ = default ] [READONLY] } 
    [ ,...n ]
  ]
)
RETURNS @return_variable TABLE <table_type_definition>
    [ WITH <function_option> [ ,...n ] ]
    [ AS ]
    BEGIN 
                function_body 
        RETURN
    END
[ ; ]
多状态表值函数
创建函数[schema_name.]FUNCTION_name
([{@parameter\u name[AS][type\u schema\u name.]parameter\u data\u type
[=默认值][只读]}
[,…n]
]
)
返回@return\u变量表
[与[,…n]]
[作为]
开始
功能体
回来
终止
[ ; ]

遗憾的是@return\u变量不能声明为表类型,您必须将TVP类型的声明复制到函数return table type中。

这一个编译很好:

--Returns the name of the field to use to find results
ALTER FUNCTION f_Get_Total_Amount_Due(
    @CUSTOMER_LIST          [tpCSFM_CUSTOMER_SET_FOR_MONEY] READONLY
)
RETURNS @RESULT TABLE(
    tpCSFM_CUS_ID   uniqueidentifier PRIMARY KEY,
    tpCSFM_MONEY_VALUE  MONEY NULL
)
AS
BEGIN
--Prepare the return value, start with initial customer list
INSERT INTO @RESULT SELECT * FROM @CUSTOMER_LIST

--Todo: populate with real values
UPDATE @RESULT SET tpCSFM_MONEY_VALUE = 100

--return total amounts as currency
RETURN
END

什么是
[tpCSFM\u CUSTOMER\u SET\u FOR\u MONEY]
?我已经在数据库中创建了一个自定义类型您知道自定义类型通常是个坏主意吗?它们会导致巨大的维护问题?我会避免使用它们!来自联机丛书:“要修改用户定义的类型,必须使用drop type语句删除该类型,然后重新创建它。”这意味着您需要先将使用该类型的所有数据更改为另一类型,然后删除该类型,再创建新类型,然后将所有要使用该数据类型的字段更改回新类型。这是一场维护噩梦,据我所知,管理大型数据库的人都不会允许使用自定义类型。我确实注意到,在更改时,我必须先删除自定义类型。谢谢你的警告!