无法访问从代码创建的临时表

3
我在使用临时表时遇到了一个非常奇怪的问题。我在代码中创建了一个临时表,在MSSQL中的tempdb.sys.tables下也显示出来了,但是如果我尝试从它里面选择数据,就会出现“无效对象名'#Update'”的错误。
如果我直接将创建临时表的SQL代码从我的代码中复制并粘贴到MSSQL管理器中运行,它就会创建这个临时表,然后我就可以从中选择数据。此时,在tempdb.sys.tables中会显示两个完全相同的临时表。
也许我忽略了什么,但这似乎很奇怪。
using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();

            //Execute the command to make a temp table
            using (SqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "create table #UpdatePOS (Store_ID nvarchar(50), POSItem_Id nvarchar(50), POSSalesDate datetime, LastModifiedWhen datetime, UpdateResult bit, QTY decimal(18,0));";
                cmd.ExecuteNonQuery();
            }

        }

谢谢!


数据库不能有两个相同的表,你在它们的名称中漏掉了一些东西,是sys还是dbo? - Iłya Bursov
我一开始以为是dbo,但也许它被创建成了系统表? - chobo
嗯,我可以回答关于你的服务器上创建了什么的问题吗? - Iłya Bursov
我不确定你的意思是什么。 - chobo
你的问题是"也许它被创建为系统表?" - 我不能回答这个问题,因为我不知道在你的数据库中创建了什么,你应该去检查一下。 - Iłya Bursov
2个回答

6
本地临时表(以单个#符号为前缀)在创建它的连接断开后会消失。如果您使用一个SqlConnection对象创建该表并尝试通过另一个对象访问它,则可能需要使用全局临时表(以##为前缀),但是因为它在断开连接后仍然存在,所以您必须在运行SQL之前截断任何数据。
更多阅读:http://technet.microsoft.com/en-us/library/ms186986%28v=sql.105%29.aspx

我可以通过 SQL Server Management Studio 使用 ## 访问临时表,但问题似乎是其他原因导致的。如果我只使用一个 # 创建它,则可以在 sys.temp 表中看到它,但无法对其进行选择。 - chobo
你能从##表中进行选择吗? - Troy Carlson
是的,我可以从##中选择,但不能从#中选择。你认为这是因为它是使用asp.net进程创建的,当我进入sql server管理工具并尝试选择时,无法选择是因为它超出了范围? - chobo

2

永远不可能有两张完全相同的表,可能有些人没有注意到,但表名上一定会有所变化。使用 #(本地临时表)在 SqlConnection 中创建的临时表将无法在 MSSQL 管理器中访问,因为它被视为另一个会话,并且本地临时表只能在同一会话中访问。您可以使用 ## 来创建全局临时表并实现此功能。


1
这基本上就是我在上面的评论中得出的结论 :) - chobo
1
由于我的声誉不允许我进行评论,所以我将其作为答案发布了。 - Ram Grandhi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接