テーブル値関数で変数を宣言する


110

テーブル値関数で変数を宣言するにはどうすればよいですか?(私のタイトルのように)


インラインまたはマルチステートメント?同様MSDNには、それらを説明しますか?
gbn 2011

回答:


205

テーブル値関数には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

33
最初の例は「インラインテーブル値関数」として知られており、マルチステートメントテーブル値関数と比較してパフォーマンス上の利点があります。つまり、データベースサーバーはITVFを親クエリにインライン化してクエリを再構成でき、基本的にパラメーター化されます。一方、MSTVFは不透明なストアドプロシージャのように動作します(ただし、sprocに比べて独自の利点があります)。インライン関数はMSTVFよりも優先する必要があります。中間値(複雑なスカラー関数式の結果など)を計算して保存する必要がある場合は、サブクエリを使用します。VIEW

1
また、設定したい変数にデータを入力するために使用している結果が一般化できる場合は、それを生成する別の関数を作成することを検討してください。これにより、動的に生成された値を関数に挿入しながら、上記の@Daiで説明されているITVFをすべての利点とともに使用できるようになります。MSTVFフォームを使用する手間を省くために、ヘルパー関数にパラメーターの1つを渡す上記のソリューション(@MikaelErikssonに感謝!)を使用して関数を書いたところです。
naughtilus 2017

1
最大のコストは関数の挿入です。テーブル変数に挿入せずにこのコストをスキップして、selectの結果を返す方法がわかりません
uzay95

@naughtilusこの例を見ていただければ幸いです。提案とともに別の回答を提供することを検討しましたか?
ジャック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.