在Dynamic Query中从另一个临时表创建临时表

时间:2013-06-03 09:12:54

标签: sql sql-server sql-server-2008

我尝试从另一个#temp表创建#temp表,然后通过错误。

 Set @Query = 'Select Work_Order_No,ServiceCode,StageNo,ItemWeight,StagePercentage,FebLocation 
    INTO #TempMaster
    FROM #Temp '
EXEC(@Query)

以上查询抛出错误

Invalid object name '#TempMaster'.

如果我执行此查询

Set   @Query = 'Select Work_Order_No,ServiceCode,StageNo,ItemWeight,StagePercentage,FebLocation 
    INTO ##TempMaster
    FROM #Temp '

EXEC(@Query)

然后它工作正常。这两种说法有什么不同。第一个查询抛出错误和第二个查询成功运行的原因是什么。

4 个答案:

答案 0 :(得分:3)

编辑之后的区别在于,当作用域退出并且父作用域不可见时,在子作用域中创建的本地#temp表将自动删除。 ##前缀表是全局临时表,并且在作用域退出时不会自动删除。相反,当关闭创建连接并且当前没有其他连接正在访问它时,它们将被删除。

无论如何都没有明确要求在此使用EXEC,因此您可以使用最初发布的代码来避免此问题。

SELECT Work_Order_No,
       ServiceCode,
       StageNo,
       ItemWeight,
       StagePercentage,
       FebLocation
INTO   #TempMaster
FROM   #Temp 

答案 1 :(得分:1)

试试这个 -

DECLARE @SQL NVARCHAR(MAX)

SELECT @SQL = '
IF OBJECT_ID (N''tempdb.dbo.##TempMaster'') IS NOT NULL
   DROP TABLE ##TempMaster

SELECT Work_Order_No,ServiceCode,StageNo,ItemWeight,StagePercentage,FebLocation 
INTO ##TempMaster
FROM #Temp'

EXEC sys.sp_executesql @SQL

答案 2 :(得分:0)

这样做:

set @Query = 'select Work_Order_No,ServiceCode,StageNo,ItemWeight,StagePercentage,FebLocation 
INTO #TempMaster1
FROM tablename

select * into #t from #TempMaster1

drop table #TempMaster1
drop table #t '

exec (@Query)

答案 3 :(得分:0)

如果在动态查询中创建#temp表,它只在该动态查询中有效,并且在动态查询完成执行后不能再使用它。

如果你真的需要动态填充你的表 - 你应该预先创建它。