20

手順を作成しました

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正常に動作しています

問題は何ですか?どうすれば解決できますか?

4

3 に答える 3

20

おそらく、#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'

私の質問は次のとおりです。

  1. 本当に一時テーブルを使用する必要がありますか?サブクエリなどを使用しないと解決策を見つけることができませんか?
  2. sp_executesql を使用して、このように sql を実行する必要がありますか?
于 2009-08-12T11:19:07.733 に答える
5

CREATE TABLEを使用して一時テーブルを作成し、SELECT INTO の代わりにINSERT INTOを使用して値を挿入します。

これで問題が解決しました。

于 2016-09-09T05:29:32.430 に答える
1

実行するには、最初にddlステートメントを使用して#tmp_tableを作成する必要があると思います。

次に、execを実行すると、execで作成したストアドプロシージャの名前は同じになりtemp table viz.#tmp_tableます。

于 2011-06-09T16:06:44.177 に答える