2011-07-12 10 views
74

テーブル値関数で変数を宣言するにはどうすればよいですか?テーブル値関数で変数を宣言する

+0

インラインまたは複数ステートメント

この

は、変数を持つことができませんか? * MSDN *のように記述されていますか? – gbn

+9

@ YogeshBhadauiryaばかげた "検索エンジンを使う"という問題は、* this *は検索エンジンが指しているところです。無限の再帰状態の種類。ページを削除するか、質問に答えてください。 – Volvox

+24

この質問にはもう一度恋をする必要があります。実際には*本当の質問です。 – Askolein

答えて

136

テーブル値関数の2つの味があります。 1つはselectステートメントであり、1つはselectステートメント以外の行を持つことができます。あなたはこの代わりのようにしなければならない

create function Func() returns table 
as 
return 
select 10 as ColName 

create function Func() 
returns @T table(ColName int) 
as 
begin 
    declare @Var int 
    set @Var = 10 
    insert into @T(ColName) values (@Var) 
    return 
end 
+1

ありがとう、それは非常に役に立ちます –

+13

最初の例は、マルチステートメントテーブル値関数と比較してパフォーマンス上の利点を持つ「インラインテーブル値関数」として知られています。すなわち、データベースサーバーは* ITVF * MSTVFは不透明なストアドプロシージャのように振る舞いますが(しかし、sprocsと比較して独自の利点を持っていますが)、親クエリにインライン展開して、基本的にパラメータ化されたVIEWになります。インライン関数はMSTVFよりも優先されるべきです。中間値(複雑なスカラー関数式の結果など)を計算して格納する必要がある場合は、サブクエリを使用します。 – Dai

+0

設定したい変数に値を設定するために使用している結果が何らかの形で一般化できれば、それを生成する別の関数を作成することを検討することもできます。 これは、上記の@Daiで説明されているITVFをすべての利点と共に使用しながら、動的に生成された値を関数に挿入することを可能にします。私はちょうど上記の解決策(@MikaelErikssonありがとう!)の助けを借りて関数を書いています。これはヘルパー関数にそのパラメータの1つを渡して、MSTVFフォームを使用する必要がありません。 – naughtilus