手順を作成しました
create procedure testProcedure_One
as
DECLARE @Query nvarchar(4000)
begin
SET @Query = 'SELECT * into #temptest FROM Table1'
Exec sp_Executesql @query
SELECT * FROM #temptest
drop table #temptest
end
プロシージャtestProcedure_One
を実行すると、次のエラーメッセージが表示されます。
Invalid object name '#temp'
しかし、##temp means
を使用すると、機能します。
create procedure testProcedure_two
as
DECLARE @Query nvarchar(4000)
begin
SET @Query = 'SELECT * into ##temptest FROM Table1'
Exec sp_Executesql @query
SELECT * FROM ##temptest
drop table ##temptest
end
testProcedure_two
は正常に機能しています
何が問題なのですか?どうすれば解決できますか?
おそらく、#tempからSELECTする次のコードがあり、エラーが発生しますか?
それは範囲にあります。 ## tempは、他のセッションで使用できるグローバルな一時テーブルです。 #tempは「ローカル」一時テーブルであり、現在実行中のスコープからのみアクセスできます。 sp_executesqlは別のスコープで実行されるため、データを#tempに挿入しますが、sp_executesql呼び出しの外部でそのテーブルにアクセスしようとしても、データは見つかりません。
例えば#Testが作成され、sp_executesqlコンテキストにのみ表示されるため、このエラーは次のようになります。
EXECUTE sp_executesql N'SELECT 1 AS Field1 INTO #Test'
SELECT * FROM #Test
上記は、グローバル一時テーブルを作成する## Testで機能します。
SELECTは同じスコープの一部であるため、これは機能します。
EXECUTE sp_executesql N'SELECT 1 AS Field1 INTO #Test; SELECT * FROM #Test'
私の質問は次のようになります:
CREATE TABLEを使用して一時テーブルを作成し、次にINSERT INTOを使用してSELECTINTOの代わりに値を挿入します。
これは私にとって問題を修正しました。
実行するには、最初にddlステートメントを使用して#tmp_tableを作成する必要があると思います。
次に、execを実行すると、execで作成したストアドプロシージャの名前は同じである必要がありますtemp table viz.#tmp_table
。