【问题标题】:Create temp table from another temp table in Dynamic Query从 Dynamic Query 中的另一个临时表创建临时表
【发布时间】:2013-06-03 17:32:24
【问题描述】:

我尝试从另一个#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)

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

【问题讨论】:

  • 您发布的代码不会抛出错误SQL Fiddle。也许错误来自您没有向我们展示的另一行。
  • 第一个查询抛出错误,第二个执行成功
  • 两个查询都运行良好
  • 对不起,我更新了查询
  • 所以不是动态查询执行引发了错误,对吧?问题发生在之后 EXEC(@Query),特别是当您尝试从动态查询的INTO 子句中指定的表中读取数据时。

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


【解决方案1】:

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

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

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

【讨论】:

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

试试这个 -

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

【讨论】:

  • 我的##TempMaster 工作正常我只想知道为什么#TempMaster 会抛出错误
  • 请参阅@Martin Smith 的回答。
【解决方案3】:

这样做:

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)

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多