存储过程看不到在同一连接中创建的临时表

时间:2016-11-21 18:27:15

标签: c# sql .net sql-server visual-studio

为什么我的临时表会被删除?

目前,我们有:

var listOfSqlCommands = new List<SqlCommand>();

使用SqlCommand

填充CommandType = CommandType.StoredProcedure;

背景资料:

  • 我正在创建一个临时表(这会创建一个SqlCommand
  • 然后获取存储过程列表,并为每个存储过程创建SqlCommand
  • 我需要将临时表用于其他命令
  • 完成SQL Server跟踪后,我没有发现sp_executesql被使用的迹象。分析器显示临时表是使用exec CreateTempTableSproc
  • 创建的

完整代码:

var listOfSqlCommands = new List<SqlCommand>();

using (var O0aAConnection = new SqlConnection(connectionString))
{
    try
    {
        O0aAConnection.Open();

        foreach (DataTable dt in ds.Tables)
        {
            EntityName = StringDefaultIfNull(syncConfig.Root.XPathSelectElement("./entity[@name='" + dt.TableName + "']"), "O0aATableName").Substring(3);

            var O0aACommand = new SqlCommand();

            O0aACommand.CommandType = CommandType.StoredProcedure;
            O0aACommand.CommandText = "O0aA42_P_" + EntityName + "Sync_OfferingPublish";

            var entityNameParam = new SqlParameter("@EntityName", dt.TableName);

            O0aACommand.Parameters.Clear();
            O0aACommand.Parameters.Add(entityNameParam);

            var tblParam = new SqlParameter("@O42_" + EntityName, SqlDbType.Structured);
            tblParam.Value = dt;
            O0aACommand.Parameters.Add(tblParam);

            O0aACommand.Connection = O0aAConnection;

            listOfSqlCommands.Add(O0aACommand);
        }

        using (var createTempTableCommand = new SqlCommand())
        {
            createTempTableCommand.CommandText = "CreateTempTableSproc";
            createTempTableCommand.CommandType = CommandType.StoredProcedure;
            createTempTableCommand.Connection = O0aAConnection;

            createTempTableCommand.ExecuteNonQuery();
        }

        // the commands here are NOT seeing the temp table that was created above!!
        foreach (var command in listOfSqlCommands)
        {
            using (var da = new SqlDataAdapter(command))
            {
                da.Fill(dtResults);
            }
        }
    }                
    finally
    {
        O0aAConnection.Close();
    }            
}

为什么我的临时表会被删除?

2 个答案:

答案 0 :(得分:3)

临时表(本地和全局)仅存在于会话的上下文或创建它们的存储过程中。

您必须不使用存储过程来创建它。

EXEC还将为临时表创建一个上下文,如果它们是在EXEC中创建的,它们将从EXEC返回时消失。 EXEC调用的代码将看到现有的临时表。

答案 1 :(得分:1)

您可以链接存储过程的结果

例如:

CREATE PROCEDURE [dbo].[prcCall1]
As
Begin
    Select Val=1 into #Temp
    Exec [prcCall2]
    Select * from #Temp
End

Go

CREATE PROCEDURE [dbo].[prcCall2]
As
Begin
    Update #Temp Set Val=Val+1
    --Select * from #Temp
End

Go

Exec [dbo].[prcCall1]

返回

Val
2