2016-11-21 50 views
1

テンポラリテーブルがドロップされるのはなぜですか?同じ接続で作成されたテンポラリテーブルがストアドプロシージャに表示されない

現在、我々は持っている:

var listOfSqlCommands = new List<SqlCommand>(); 

それはSqlCommand

CommandType = CommandType.StoredProcedure;と背景情報が取り込まれます:

  • 私は
  • (これは SqlCommandを作成する)一時テーブルを作成しています
  • 次に、ストアドプロシージャのリストを取得し、を作成します各1
  • 他のコマンドのテンポラリテーブルを使用する必要があります
  • sp_executesqlが使用されていることがわかりました。

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

    なぜ私の一時表がドロップされますん:プロファイラは、一時テーブルがexec CreateTempTableSproc

完全なコードを使用して作成されていたことが示されましたか?

答えて

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

関連する問題