在存储过程中使用带有exec @sql的临时表

时间:2013-10-24 01:52:48

标签: sql-server stored-procedures temp-tables

我有一个存储过程,其中一部分如下: @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”,因为它不存在或您没有权限。

是否无法使用临时表并执行它或者我做错了什么?

2 个答案:

答案 0 :(得分:7)

#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。我假设你的查询(或者你以后用临时表做的事情)比这更复杂 - 如果是这样的话,不要为我们愚蠢。告诉我们你的整个问题会阻止大量的来回,因为额外的细节可能会改变答案。

答案 1 :(得分:2)

这就是我要做的事。

MongoDatabse