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

の外で table 変数を参照することはできませんFROMUPDATEこれは... 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 に答える