如果我运行此动态查询:
declare @test nvarchar(1000) = 'select * into #tmp7 from bauser'
execute(@test)
然后尝试使用以下方式查询#tmp7
select * from #tmp7
抛出错误:
无效的对象名称'#tmp7'。
但是,如果我手动运行相同的查询:
select * into #tmp7 from bauser
一切都好。创建临时表并填充结果。
为什么不能使用动态查询执行?
答案 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)