2011-09-27 47 views
0
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消息。无法从已成功创建的#temp表中选择

但是,如果我执行的代码来获取数据(当然,我知道这是空的),我得到的最后一行

无效的对象名称#TMP_TAB_BANK157“

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

回答

3

#TEMP只有在创建它们的上下文中才可以使用表。如果在一个spid或连接中创建#temp1,则除了子范围之外,不能从任何其他范围访问它。

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

替代品有:

  • ##GLOBAL临时表,它有自己的风险。
  • 真实表格