私には2つのストアドプロシージャがあり、1つは支払いのリストを返し、もう1つは通貨でグループ化されたそれらの支払いの概要を返します。現在、クエリが重複しています。支払いのリストを返すストアドプロシージャのメインクエリは、通貨ごとの支払いの概要を返すストアドプロシージャのサブクエリです。支払いのリストを返すストアドプロシージャを、通貨ごとの支払いの概要を返すストアドプロシージャのサブクエリにして、この重複を解消したいと思います。 SQL Server 2008ではそれが可能ですか?
最初のプロシージャをTABLE-VALUED関数に変換した方がよいでしょう。複数のステートメントが含まれる場合は、最初に戻りテーブルの構造を定義して、データを設定する必要があります。
サンプル:
CREATE proc getRecords @t char(1)
as
set nocouut on;
-- other statements --
-- final select
select * from master..spt_values where type = @t
GO
-になる-
CREATE FUNCTION fn_getRecords(@t char(1))
returns @output table(
name sysname,
number int,
type char(1),
low int,
high int,
status int) as
begin
-- other statements --
-- final select
insert @output
select * from master..spt_values where type = @t
return
end;
ただし、それが単純な選択である場合(または単一のステートメントとして記述できる場合)、高度に最適化されたINLINE tvfフォームを使用できます。
CREATE FUNCTION fn2_getRecords(@t char(1))
returns table as return
-- **NO** other statements; single statement table --
select * from master..spt_values where type = @t
2番目のプロシージャは、最初のプロシージャから単に選択します
create proc getRecordsByStatus @t char(1)
as
select status, COUNT(*) CountRows from dbo.fn2_getRecords(@t)
group by status
そして、あなたが以前呼んだ場所
EXEC firstProc @param
結果を取得するには、ここから選択します
SELECT * FROM firstProc(@param)
ストアドプロシージャからの出力を一時テーブルにキャプチャし、そのテーブルをメインクエリで使用できます。
列IDと名前をテーブル変数に返すストアドプロシージャの出力をキャプチャします。
declare @T table (ID int, Name nvarchar(50))
insert into @T
exec StoredProcedure
ストアドプロシージャの結果をテーブル変数または一時テーブルに挿入すると、うまくいきます。
クエリ間でSQL Serverのコードを再利用しようとしている場合は、テーブル関数を使用すると柔軟性が高まります。パラメータを渡したり、フロー制御ロジックを使用したりする必要がない場合は、ビューで問題ありません。これらは、他の関数、プロシージャ、ビュー、またはt-sqlステートメントのテーブルのように使用できます。
リストをテーブル値関数に返すプロシージャを作成した場合、それをサブクエリで使用できると思います。
パラメータ化する必要がある場合を除き、ビューを使用します。その場合、可能な場合はインラインテーブル値関数を使用します。ただし、それがマルチステートメント操作である必要がない限り、テーブル値関数を引き続き使用できます。ただし、通常は効率が低下します。