2010-03-23 65 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的聲明鍵入到函數返回表類型中。