2012-04-16 34 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 

は、コンパイル・エラー

01生成します

スカラー変数 "@ret"を宣言しなければなりません。

なぜですか?それを修正するには?

+0

現在のサンプルでは、​​すべてを1つのステートメントとして持つことができます。しかし、それは現実の関数の単純化されたバージョンである現在のサンプルのために働く。 – Cherven

答えて

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; 
+0

は逆の経験を持っていました。一時テーブルのエイリアスを使用していたが、その名前を使用していませんでした。 – FistOfFury

0

私はOPと同じ問題がありました。私は、関数内でテーブル変数を持っていたし、私が代わりにエイリアスのテーブル変数の実際の名前を使用するには、UPDATEステートメントを変更したときに、私は、エラーを除き

"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 
関連する問題