2013-06-03 127 views
2

我尝试从另一个#temp表创建#temp表,然后通过错误。从动态查询中的另一个临时表创建临时表

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

上面的查询抛出错误

,如果我执行这个查询

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

EXEC(@Query) 

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

+3

您发布的代码确实没有**抛出错误[SQL小提琴](http://sqlfiddle.com/#!3/d41d8/15016)。也许这个错误是来自另一条你没有告诉我们的线路。 –

+0

第一个查询抛出错误,第二个成功执行 –

+0

两个查询都正常运行 –

回答

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

继编辑不同的是,在一个子作用域创建的本地#temp表会自动掉落时的范围退出,不是父作用域可见。 ##前缀表是全局临时表,并且在范围退出时不会自动删除。相反,当创建连接关闭并且当前没有其他连接正在访问它时,它们将被丢弃。

无论如何,这里没有明显的要求使用EXEC,所以你可以通过使用你最初发布的代码来避免这个问题。

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

我需要动态查询 –

+3

@SaroopTrivedi - 那么在这种情况下,您需要一个全局的'## temp'表,然后在子范围中创建的本地表将自动删除。或者您需要将使用该表的所有代码添加到相同的子范围动态查询中。实际上,可以在父作用域中创建一个本地'#temp'表,然后在子作用域中创建'ALTER',但这非常混乱。 –

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 
+0

我的## TempMaster工作正常我只是想知道为什么#TempMaster抛出错误 –

+2

请参阅@Martin Smith的答案。 – Devart

0

如果创建#temp表动态查询里面仅仅是动态查询内有效,之后动态查询执行完毕以后不能使用它。

如果您确实需要动态填充表格 - 您应该预先创建它。