44

sp_Executedsql の一時テーブル #TempTable を選択しようとしていました。正常に挿入されたかどうかはわかりませんが、正常に挿入されたことを意味するメッセージが書き込まれていますか (359 行が影響を受けています)。以下のスクリプト

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'.

「選択」セクションのみが機能していると思われます。インサートが機能していません。どのように修正しますか?

4

9 に答える 9

45

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

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

CREATE TABLE #tempTable(id int);

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

SELECT * FROM #tempTable;
于 2012-08-10T10:12:10.773 に答える
37

ローカル一時テーブル#table_nameは現在のセッションでのみ表示され、グローバル一時##table_nameテーブルはすべてのセッションで表示されます。どちらも、セッションが閉じられるまで有効です。 sp_executesql- 独自のセッションを作成するため (「スコープ」という言葉の方が適切かもしれません)、それが発生する理由です。

于 2011-11-07T17:28:28.277 に答える
7

動的 SQL の一時テーブルは、非動的 SQL 部分の範囲外です。

これに対処する方法をここで見てください:SQLサーバーのローカル一時テーブルについて少し

于 2011-11-07T17:28:03.997 に答える
3

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

于 2011-11-07T17:29:02.900 に答える
2

これは私のために働いた

declare @sql nvarchar(max)     
create table #temp ( listId int, Name nvarchar(200))     
set @sql = 'SELECT top 10 ListId, Name FROM [V12-ListSelector].[dbo].[List]'    
insert into #temp
exec sp_executesql  @sql    
select * from #temp    
drop table #temp
于 2018-08-21T19:31:53.330 に答える
1

この問題を回避するには、sp_executesql を実行する前に、最初に CREATE TABLE #TEMPTABLE コマンドを使用して空の一時テーブルを生成します。次に、sp_executesql を使用して INSERT INTO #TEMPTABLE を実行します。これは機能します。これは、すべてのクエリが通常 sp_executesql を介して実行されるセットアップがあるため、この問題を解決する方法です。

于 2016-03-22T10:18:22.190 に答える