我尝试从另一个#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)
那么它工作得很好。这两种说法有什么不同?第一个查询抛出错误而第二个查询成功的原因是什么?
编辑后的不同之处在于,在子作用域中创建的本地#temp
表在退出作用域时自动删除,并且对父作用域不可见。##
前缀表是全局临时表,在退出作用域时不会自动删除。相反,当创建的连接关闭且当前没有其他连接正在访问它时,它们将被删除。
这里没有明显要求使用EXEC
,所以你可以通过使用你最初发布的代码来避免这个问题。
SELECT Work_Order_No,
ServiceCode,
StageNo,
ItemWeight,
StagePercentage,
FebLocation
INTO #TempMaster
FROM #Temp
试试这个-
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
这样做:
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)
如果你在动态查询中创建了#temp表,它只在动态查询中有效,在动态查询完成后你不能使用它。
如果你真的需要动态填充你的表-你应该提前创建它