web-dev-qa-db-ja.com

SQL Server 2008でストアドプロシージャをサブクエリとして使用することはできますか?

私には2つのストアドプロシージャがあり、1つは支払いのリストを返し、もう1つは通貨でグループ化されたそれらの支払いの概要を返します。現在、クエリが重複しています。支払いのリストを返すストアドプロシージャのメインクエリは、通貨ごとの支払いの概要を返すストアドプロシージャのサブクエリです。支払いのリストを返すストアドプロシージャを、通貨ごとの支払いの概要を返すストアドプロシージャのサブクエリにして、この重複を解消したいと思います。 SQL Server 2008ではそれが可能ですか?

19
pyon

最初のプロシージャを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)
18
RichardTheKiwi

ストアドプロシージャからの出力を一時テーブルにキャプチャし、そのテーブルをメインクエリで使用できます。

列IDと名前をテーブル変数に返すストアドプロシージャの出力をキャプチャします。

declare @T table (ID int, Name nvarchar(50))

insert into @T
exec StoredProcedure
6
Mikael Eriksson

ストアドプロシージャの結果をテーブル変数または一時テーブルに挿入すると、うまくいきます。

クエリ間でSQL Serverのコードを再利用しようとしている場合は、テーブル関数を使用すると柔軟性が高まります。パラメータを渡したり、フロー制御ロジックを使用したりする必要がない場合は、ビューで問題ありません。これらは、他の関数、プロシージャ、ビュー、またはt-sqlステートメントのテーブルのように使用できます。

6
JeffO

リストをテーブル値関数に返すプロシージャを作成した場合、それをサブクエリで使用できると思います。

3
Colin

パラメータ化する必要がある場合を除き、ビューを使用します。その場合、可能な場合はインラインテーブル値関数を使用します。ただし、それがマルチステートメント操作である必要がない限り、テーブル値関数を引き続き使用できます。ただし、通常は効率が低下します。

1
Cade Roux