无法从成功创建的#temp表中进行选择

时间:2011-09-27 12:17:40

标签: sql-server-2005 temp-tables

DECLARE @tmp_tab VARCHAR(20)
SELECT  @TMP_TAB = '#TMP_TAB_BANK' + CAST(USER_ID(USER) AS NVARCHAR)
                                    + CAST(@@SPID AS NVARCHAR)

EXEC('CREATE TABLE ' + @TMP_TAB + (ID INT NULL, NAME VARCHAR NULL)')

//Break point

EXEC('select * from ' + @TMP_TAB)

我在SQL Server 2005中工作。在上面的代码中,我决定将临时表命名为什么。然后我创建临时表。如果我只运行这些代码,则会收到Commands completed successfully消息。

但是如果我执行最后一行代码来检索数据(好吧,我知道它是空的)我得到了

  

无效的对象名称'#TMP_TAB_BANK157'

为什么我不能从刚刚创建的表中获取记录?如果没有创建临时表,那么为什么我没有收到任何警告?

1 个答案:

答案 0 :(得分:3)

#TEMP表仅在创建它们的上下文中可用。如果在一个spid或连接中创建#temp1,则除了子范围外,您无法从任何其他范围访问它。

如果在动态SQL中创建#TEMP表,则需要在同一范围内从中进行选择。

替代方案是:

  • ##GLOBAL临时表,它们都有自己的风险。
  • 真实桌子