不是从动态查询执行创建的临时表

时间:2017-02-16 17:41:00

标签: sql-server tsql

如果我运行此动态查询:

declare @test nvarchar(1000) = 'select * into #tmp7 from bauser'
execute(@test)

然后尝试使用以下方式查询#tmp7

select * from #tmp7
抛出

错误:

  

无效的对象名称'#tmp7'。

但是,如果我手动运行相同的查询:

select * into #tmp7 from bauser

一切都好。创建临时表并填充结果。

为什么不能使用动态查询执行?

2 个答案:

答案 0 :(得分:5)

SCOPE!

临时表仅存在于动态执行查询的范围内 如果你想让select将它放在动态查询中

declare @test nvarchar(1000) = 'select * into #tmp7 from bauser

select * from #tmp7'
execute(@test)

此外,您可以使用此

检查是否存在此类对象
select * from sys.sysobjects so where so.name like '%tmp7%'

看到这个类似的问题 SQL Server 2005 and temporary table scope

修改

临时表是一个表,所以你可以添加列,索引等。这些表实际上存在于TempDB数据库中,你甚至可以找到"他们(他们可以看到奇怪的长名字),但他们在执行你的EXEC后被摧毁。

也许你的问题是尝试动态方法或根本不关心你的问题。尝试发布一个新问题你得到了什么,以及你需要做些什么来获得进一步的帮助。

答案 1 :(得分:1)

如果使用动态SQL创建临时表,则它将无法在动态SQL范围之外使用。

您需要使用动态SQL创建它,然后使用INSERT INTO填充表格。

-- use this trick to create the temp table easily.
SELECT * INTO #tmp7
FROM bauser
WHERE 1=2

declare @test nvarchar(1000) = 'insert into #tmp7 select * from bauser'
execute(@test)