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



我尝试从另一个#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表,它只在动态查询中有效,在动态查询完成后你不能使用它。

如果你真的需要动态填充你的表-你应该提前创建它

最新更新