Wil*_*ang 11 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
Run Code Online (Sandbox Code Playgroud)
问题是当我执行存储过程时,会出现一条错误消息:找不到对象"#tmpA",因为它不存在或者您没有权限.
是不是可以使用临时表并执行它或我做错了什么?
#tmpA是在不同的范围内创建的,因此在动态SQL之外是不可见的.您可以将最终SELECT成为动态SQL的一部分.还有其他一些事情:
sp_executesql用于动态SQL ; 在这种情况下,它允许您参数化@DRange值并避免SQL注入风险.N- 需要Unicode,sp_executesql但如果您在代码的其他区域中对此产生了懒惰,则还会导致痛苦的隐式转换.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;
Run Code Online (Sandbox Code Playgroud)
当然,如果你所做的只是选择,我很难理解为什么这是动态SQL.我假设你的查询(或者你以后用临时表做的事情)比这更复杂 - 如果是这样的话,不要为我们愚蠢.告诉我们你的整个问题会阻止很多来回,因为额外的细节可能会改变答案.
| 归档时间: |
|
| 查看次数: |
18190 次 |
| 最近记录: |