ストアドプロシージャがあり、その一部は次のとおりです。@ 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"が見つかりません。
一時テーブルを使用して実行することはできませんか、それとも何か間違ったことをしましたか?
#tmpA
は別のスコープで作成されるため、動的SQLの外部には表示されません。究極のSELECT
を動的SQLの一部にすることができます。また、他にもいくつかあります。
sp_executesql
を使用します ;この場合、@DRange
値をパラメーター化して、SQLインジェクションのリスクを回避できます。N
のプレフィックスを付けます-sp_executesql
にはUnicodeが必要ですが、コードの他の領域でこれについて怠惰になると、面倒な暗黙の変換につながる可能性もあります。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であるのか理解するのに苦労しています。あなたのクエリ(または後で一時テーブルで行うこと)はこれよりも複雑だと思います-もしそうなら、私たちのためにそれをばかにしないでください。追加の詳細が答えを変える可能性があるので、あなたの全体の問題を私たちに話すことは、前後の多くを防ぐでしょう。
これが私がすることです。
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