我正在构建一个返回表结果的函数
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 :(得分:2)
您无法在FROM
之外引用表变量。这不仅仅是来自http://msdn.microsoft.com/en-us/library/ms175010.aspx的UPDATE
...
在FROM子句之外,必须使用别名...
引用表变量
...所以你可以尝试:
UPDATE r
SET
r.CityName = c.Name
FROM
@ret AS r
INNER JOIN dbo.Cities AS c
ON r.CityId = c.CityId;
答案 1 :(得分:0)
我和OP有同样的问题。我在函数中有表变量,我收到了错误
"Invalid use of side-effecting or time-dependent operator in 'UPDATE' within a function"
除此之外,当我更改update语句以使用表变量的实际名称而不是别名时,它可以工作。该函数是多语句函数,表变量是结果表(在函数的开头定义)。不知道为什么它有效,但我建议尝试将其作为解决方案。
例如,我改变了:
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
答案 2 :(得分:0)
您不必使用别名;您实际上可以执行以下操作:(问题似乎在SQL解析器中)。注意@ret的括号。
UPDATE @ret
SET
CityName = Cities.Name
FROM
@ret JOIN Cities
ON [@ret].CityId= Cities.CityId