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”。

为什么?如何解决?

4

3 回答 3

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;
于 2012-04-16T20:50:27.087 回答
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
于 2012-08-15T19:00:21.817 回答
0

您不必使用别名;您实际上可以执行以下操作:(问题似乎出在 SQL 解析器中)。注意@ret 周围的括号。

UPDATE @ret
SET
    CityName = Cities.Name
FROM
    @ret JOIN Cities
        ON [@ret].CityId= Cities.CityId
于 2013-09-26T14:52:31.177 回答