19

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

是不能使用临时表并执行它还是我做错了什么?

4

2 回答 2

11

#tmpA是在不同的范围内创建的,因此在动态 SQL 之外不可见。您可以将 UltimateSELECT作为动态 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。我假设您的查询(或您以后对临时表所做的事情)比这更复杂 - 如果是这样,请不要为我们简化它。告诉我们你的整个问题会避免很多来回,因为额外的细节可能会改变答案。

于 2013-10-24T02:02:38.457 回答
3

这就是我要做的。

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
于 2017-08-18T05:41:20.233 回答