2011-11-07 1 views
25

sp_Executedsqlのテンポラリテーブル#TempTableを選択しようとしていました。 正常に挿入されていないか、そこにそこにメッセージが書き込まれました。 (359行が影響を受けています)は、挿入が成功したことを意味しますか?#tableにselect ...のsp_executeSqlを実行しますが、テンポラリテーブルデータを選択できません。

DECLARE @Sql NVARCHAR(MAX); 
SET @Sql = 'select distinct Coloum1,Coloum2 into #TempTable 
      from SPCTable with(nolock) 
      where Convert(varchar(10), Date_Tm, 120) Between @Date_From And @Date_To'; 

SET @Sql = 'DECLARE @Date_From VARCHAR(10); 
      DECLARE @Date_To VARCHAR(10); 
      SET @Date_From = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+'''; 
      SET @Date_To = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+'''; 
      '+ @Sql; 

EXECUTE sp_executesql @Sql; 

以下 スクリプトを実行した後、メッセージに戻り、私(359行(複数可)の影響を受けます)。 次へ#TempTableからデータを選択しようとしています。

Select * From #TempTable; 

その私を返す:

Msg 208, Level 16, State 0, Line 2 
Invalid object name '#TempTable'. 

するだけでその作業だけで '選択' セクションを疑い。インサートが機能していません。 どのように修正しますか?

答えて

25

ローカルの一時テーブル#table_nameは、現在のセッションでのみ表示され、グローバル一時##table_nameテーブルはすべてのセッションで表示されます。彼らのセッションが閉鎖されるまで、両方とも生き続ける。 sp_executesql - 独自のセッションを作成します(多分「スコープ」という言葉がうまくいくでしょう)。

+2

。 'DECLARE @sql NVARCHAR(MAX); SET @sql = 'SELECT @@ SPID'; EXECUTE sp_executesql @sql; SELECT @@ SPID' –

+0

ありがとう@Michal、私はすでにこの使い方を思い出しました。ありがとうございました。もう一度 – Worgon

+0

問題を解決する方法がありました。なぜその壊れていない。私は以下の正解を提供しました。 'INSERT INTO @tmpTbl EXEC sp_executesql @ sql' –

3

テンポラリテーブルは、それらを作成する接続の長さだけ存続します。私はあなたが意図的に別の接続で選択を発行していると思います。一時的でないテーブルに挿入し、データがあるかどうかを確認することで、これをテストできます。その場合は、元のソリューションに戻って、接続オブジェクトを選択したものに確実に渡すことができます。

29

このシナリオでグローバル一時表を使用すると、セッション間に表が存在し、呼び出しコードを非同期的に使用する際に問題が発生する可能性があるため、問題が発生する可能性があります。

ローカル一時テーブルは、sp_executesqlを呼び出す前に定義されていれば使用できます。

CREATE TABLE #tempTable(id int); 

sp_executesql 'INSERT INTO #tempTable SELECT myId FROM myTable'; 

SELECT * FROM #tempTable; 
1

sp_executesqlを実行する前に、まずCREATE TABLE #TEMPTABLEコマンドを使用して空の一時テーブルを生成します。次に、sp_executesqlを使用してINSERT INTO #TEMPTABLEを実行します。これは動作します。これは、すべてのクエリが通常sp_executesqlを介して実行されるような設定をしているので、この問題を解決する方法です。あなたの@sql文字列で

1
declare @sql varchar(1000) 
set @sql="select * into #t from table;" 
set @sql [email protected] + "select * from #t;" 

execute SP_EXECUTESQL @sql 
4

into #TempTableを挿入しないでください。代わりにINSERTステートメントを使わないでSELECTステートメントを呼び出します。

最後に、そのようなあなたの一時テーブルに結果を挿入します。私は言葉「スコープ」は、より良いことだと思う

INSERT INTO @tmpTbl EXEC sp_executesql @sql 
関連する問題