2016-11-21 72 views
1

爲什麼我的臨時表會丟失?存儲過程不會看到在同一連接中創建的臨時表

目前,我們有:

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

爲什麼我的臨時表掉下來?

回答

3

臨時表(本地和全局)僅存在於會話或創建它們的存儲過程的上下文中。

您不得不使用存儲過程來創建它。

EXEC還會爲臨時表創建一個上下文,如果它們是在EXEC中創建的,它們將從EXEC返回時消失。由EXEC調用的代碼將看到現有的臨時表。

+0

我如何保持會話的一樣嗎? –

+0

如果您不在SP中執行此操作,則會話是相同的。 – Hogan

+0

使用executenonquery來運行create table語句。 – Hogan

1

您可以CHAIN存儲過程

例如結果:

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 
+0

是的,這是有效的,因爲你是從prcCall1內調用prcCall2。 – Hogan

相關問題