web-dev-qa-db-ja.com

SQL Serverは、一時テーブルを操作すると「無効なオブジェクト名 '#temp'」を表示します

手順を作成しました

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は正常に機能しています

何が問題なのですか?どうすれば解決できますか?

16
Jebli

おそらく、#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を本当に実行する必要がありますか?
17
AdaTheDev

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

これは私にとって問題を修正しました。

4
Bhoopathi Reddy

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

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

1
mahesh