2012-04-16 28 views
3

我建立一個返回表結果表值函數,表變量和「必須聲明標量變量」的錯誤消息

ALTER FUNCTION [brm].[fnComputeScores_NEW] 
(
    @var1 TINYINT 
) 
RETURNS 
@ret TABLE 
(
    [producerid] INT 
    ,[CityId] INT 
    , CityName VARCHAR(100) 
) 
AS 
BEGIN 


INSERT INTO @ret 
     SELECT [producerid], [CityId] from producers 

--placeholder 

RETURN 
END 

一切功能是精細到這個地步

,但代碼,我想把佔位符

UPDATE @ret 
SET 
    CityName = Cities.Name 
FROM 
    @ret JOIN Cities 
     ON @ret.CityId= Cities.CityId 

產生編譯錯誤

必須聲明標量變量「@ret」。

爲什麼?如何解決它?

+0

我知道,在目前的樣本中,我可以將所有內容都作爲一個語句。但它適用於實際功能的簡化版本的當前樣本。 – Cherven 2012-04-16 20:46:30

回答

2

您不能引用FROM以外的表變量。這不是獨家UPDATE ...從http://msdn.microsoft.com/en-us/library/ms175010.aspx

外FROM子句,表變量必須使用別名來引用...

...所以你可以嘗試:

UPDATE r 
SET 
    r.CityName = c.Name 
FROM 
    @ret AS r 
    INNER JOIN dbo.Cities AS c 
    ON r.CityId = c.CityId; 
+0

有相反的經歷。使用臨時表的別名不起作用,但使用名稱。 – FistOfFury 2012-08-15 19:02:34

0

我和OP有同樣的問題。我有表變量的函數,我得到的錯誤

"Invalid use of side-effecting or time-dependent operator in 'UPDATE' within a function" 

除此之外,當我改變使用表變量,而不是別名的實際名稱的更新語句,它的工作。該函數是一個多平臺函數,表變量是結果表(在函數的開頭定義)。不知道爲什麼它的工作,但我會建議嘗試作爲一種解決方案。

因此,例如,我改變了:

update c 
set column1=c.someValue+o.someValue 
from @table as c inner join [otherTable] o on c.ID=o.ID 

到:

update @table 
set column1=c.someValue+o.someValue 
from @table as c inner join [otherTable] o on c.ID=o.ID 
0

你沒有使用別名;你實際上可以做到以下幾點:(問題似乎在SQL解析器中)。注意@ret周圍的括號。

UPDATE @ret 
SET 
    CityName = Cities.Name 
FROM 
    @ret JOIN Cities 
     ON [@ret].CityId= Cities.CityId