web-dev-qa-db-ja.com

ストアドプロシージャでexec @ sqlを使用して一時テーブルを使用する

ストアドプロシージャがあり、その一部は次のとおりです。@ DRangeは着信varchar値です

declare @sql varchar(max)
set @sql = 'select * into #tmpA from TableA where create_date >= getDate - ' + @DRange + '' and is_enabled = 1'

exec (@sql)

select * from #tmpA

問題は、ストアドプロシージャを実行すると、エラーメッセージが表示されることです。オブジェクト "#tmpA"が存在しないか、権限がないため、オブジェクト "#tmpA"が見つかりません。

一時テーブルを使用して実行することはできませんか、それとも何か間違ったことをしましたか?

12
William Tang

#tmpAは別のスコープで作成されるため、動的SQLの外部には表示されません。究極のSELECTを動的SQLの一部にすることができます。また、他にもいくつかあります。

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'select * into #tmpA from dbo.TableA 
    where create_date >= DATEADD(DAY, -@DRange, GETDATE())
    AND is_enabled = 1; SELECT * FROM #tmpA';

EXEC sp_executesql @sql, N'@DRange INT', @DRange;

もちろん、選択するだけの場合、そもそもなぜこれが動的SQLであるのか理解するのに苦労しています。あなたのクエリ(または後で一時テーブルで行うこと)はこれよりも複雑だと思います-もしそうなら、私たちのためにそれをばかにしないでください。追加の詳細が答えを変える可能性があるので、あなたの全体の問題を私たちに話すことは、前後の多くを防ぐでしょう。

7
Aaron Bertrand

これが私がすることです。

declare @sql varchar(max)

set @sql = 'select * from TableA where create_date >= getDate - ' + @DRange + '' and is_enabled = 1'

Select * Into #tmpA from TableA where create_date = '01/01/1000' -- to create a blank table

insert into #tmpA

exec (@sql)

select * from #tmpA
2
Sani