【问题标题】:Stored procedures do not see temp table created in the same connection存储过程看不到在同一连接中创建的临时表
【发布时间】:2016-11-21 18:27:15
【问题描述】:

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

目前,我们有:

var listOfSqlCommands = new List<SqlCommand>();

它填充了SqlCommandCommandType = 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();
    }            
}

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 如何保持会话不变?
    • 如果你不在 SP 中,会话是一样的。
    • 使用executenonquery运行create table语句。
    【解决方案2】:

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

    例如:

    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
    

    【讨论】:

    • 是的,这是可行的,因为您是从 prcCall1 中调用 prcCall2。
    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多