RDLファイルとストアドプロシージャを使用してレポートを作成しています。 RDLファイル名はtest.rdlであり、このtest.rdlファイルには4つのストアドプロシージャが接続されています。このファイルには4つのデータセットがあります。
レポートファイル名:
test.rdl
ストアドプロシージャ名:
- sp_test_1
- sp_test_2
- sp_test_3
- sp_test_4
これらのストアドプロシージャには、同じ名前のテンポラリテーブル(#temp)があります。
create table #temp(
ID int,
Name varchar(max),
Location varchar(max)
)
insert into #temp
select * from anothertable where date between "20171001" and "20171031"
希望の結果を得て最後に一時テーブルを削除するための追加のクエリを追加します。
select . . . . . . . . . .
drop table #temp
すべての4つのストアドプロシージャには、1つの名前(#temp)を使用した一時テーブルがあります。
私の質問ですので、これは正常に動作しますか?RDLテストファイルが実行され、4つのストアドプロシージャすべてが同時に呼び出されたとき 私の懸念は、#tempテーブルでは、すべての4つのストアドプロシージャは、実行の最後にドロップテーブル#tempがあります。これは、ストアドプロシージャの1つがドロップテーブルで終了し、もう1つが実行されているためにクエリのキャンセルまたは不完全な結果の終了が発生するため、実行時の一時テーブルの充填に影響しますか?
いくつか説明してください。私はこれが有効な質問であることを願っています。
回答:
回答№1は2大まかに言って.... ローカルの一時テーブル(単一 #
)は、呼び出されたプロシージャまたは一時テーブルを作成したプロシージャと同じプロシージャから呼び出されたプロシージャでのみ使用できます。
あなたの説明から、4つのデータセットがあり、それぞれがストアドプロシージャを実行していて、これらのSPのそれぞれが #temp
。あなたは、他のSPと呼ぶSPを持っていません...
それが正しいとすれば、それはうまくいくでしょう、実際には、これが自動的に行われるので、procの最後に一時テーブルを置かなくてもすむ。
同じ名前を使用して一時テーブルがすべて参照されるという事実は重要ではありません。データベースに格納されている物理的な一時テーブルの実際の名前は#tempではなく、もっと類似しています tempdb.dbo.#temp_______________000000000123
ポイントは、実際にはデータベース内のすべてのユニークなテーブルですが、SQL Serverは自動的に作成した名前との変換を処理します。