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

时间:2013-10-16 21:46:44

标签: sql-server sql-server-2008 ado.net temp-tables

我对临时表有一个非常奇怪的问题。我在代码中创建一个临时表,它显示在MSSQL中的tempdb.sys.tables下,但如果我尝试从中选择,我会得到一个

无效的对象名称'#Update'。错误

如果我将创建临时表sql直接从我的代码中剪切并粘贴到mssql manager中并运行它,它将创建临时表,我可以从中进行选择。然后它将在tempdb.sys.tables中显示两个ideintical临时表。

也许我忽略了什么,但这看起来很奇怪。

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();
            }

        }

谢谢!

2 个答案:

答案 0 :(得分:6)

本地临时表(以单个#符号为前缀)在创建它的连接断开后消失。如果您使用一个SqlConnection对象创建该表并尝试通过另一个对象访问它,您可能希望使用全局临时表(前缀为##),但因为断开连接后它将保持存在在运行SQL之前截断任何数据。

更多阅读:http://technet.microsoft.com/en-us/library/ms186986%28v=sql.105%29.aspx

答案 1 :(得分:2)

永远不会有两个相同的表,你可能没有注意到的名称会有一些变化。在SqlConnection中使用#(本地临时表)创建的临时表在MSSQL管理器中无法访问,因为它被视为另一个会话,并且本地临时表只能在同一会话中访问。您将能够使用##,因为它们是全局临时表