2010-03-23 67 views
2

我第一次使用表值作为SQL Server 2008中函数的参数。以下代码产生此错误:SQL Server 2008表变量错误:必须声明标量变量“@RESULT”

必须声明标量变量“@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 
+0

什么是'[tpCSFM_CUSTOMER_SET_FOR_MONEY]'? – SLaks 2010-03-23 00:27:46

+0

我已经在数据库中创建了一个自定义类型 – Trindaz 2010-03-23 04:54:41

+0

您明白自定义类型通常是一个坏主意?他们可以导致巨大的维修问题?我会尽量避免使用它们!从联机书籍: “要修改用户定义类型,必须使用DROP TYPE语句删除该类型,然后重新创建它。” 这意味着您需要首先将使用该类型的所有数据更改为另一种类型,然后删除该类型,然后创建新类型,然后将所有要将该数据类型恢复为新数据的字段更改。这是一个维护噩梦,我不知道谁管理大型数据库将允许使用自定义类型。 – HLGEM 2010-03-24 17:19:29

回答

2

这一个编译罚款:

--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 
3

你的声明将陷入“多语句表值函数”的情况:

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 
[ ; ] 

不幸的是,@return_variable不能被声明为表类型,你必须复制的TVP的声明键入到函数返回表类型中。