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'
为什么我不能从刚刚创建的表中获取记录?如果没有创建临时表,那么为什么我没有收到任何警告?
答案 0 :(得分:3)
#TEMP
表仅在创建它们的上下文中可用。如果在一个spid或连接中创建#temp1
,则除了子范围外,您无法从任何其他范围访问它。
如果在动态SQL中创建#TEMP
表,则需要在同一范围内从中进行选择。
替代方案是:
##GLOBAL
临时表,它们都有自己的风险。