5

私のストアド プロシージャは、2 つの出力を返します。それらの 1 つを別のストアド プロシージャで使用したいと考えています。そのため、一時テーブルで 2 番目の出力を取得しようとしています。しかし、両方の出力の構造が異なるため、「列名または指定された値の数がテーブル定義と一致しません」というメッセージが常に表示されます。

出力の順番を変えても(1回目は2回目、2回目は1回目)、うまくいきません。

まったく新しいアプリケーションを作成していますが、ストアド プロシージャを再度使用し、別のストアド プロシージャで再度使用する必要があります。このような状況に直面した場合、おそらく多くのコードを書き直す必要があります。

非常に素晴らしい質問がありますが、これは 1 つの出力のみをカバーしています。

ストアド プロシージャの結果を一時テーブルに挿入する

ありがとう

4

1 に答える 1

9

ストアドプロシージャを変更せずに行うことはできません。

SQL Serverでは、を介して、ストアドプロシージャの最初の結果セットを別のテーブルに挿入することしかできませんINSERT...EXEC。列の数と位置は正確に一致する必要INSERT...EXECがあり、ネストすることはできません。つまり、proc1からproc2のテーブルに挿入してから、proc2からproc3のテーブルに挿入することはできません。完全INSERT...EXECに満足のいく解決策でもありません。

回避策は、呼び出し元のスコープで定義された一時テーブルに結果を挿入するようにプロシージャを変更することです。例:

create proc get_some_data as
insert #temp1 (col1, col2) select col1, col2 from table1
insert #temp2 (colA, colB) select colA, colB from table2
go
create table #temp1 (col1 int, col2 int)
create table #temp2 (colA int, colB int)
exec get_some_data
select * from #temp1
select * from #temp2
drop table #temp1
drop table #temp2
go

手順を変更できない場合は、あなたは運が悪い。 訂正: HABOが親切に指摘したように、CLRを使用して結果セットを反復することができます。詳細については、以下のリンクを参照してください。自分が何をしているのかを知っていて、他に選択肢がなければ、それほど悪くはありません。

ストアドプロシージャ間でのデータ共有の詳細については、Erland Sommarskogによるこの非常に包括的な記事を参照してください:http://www.sommarskog.se/share_data.html

于 2012-12-10T00:21:00.570 に答える