2011-10-19 2 views
2

私は一時テーブルを使ってデータを一括インポートする以下のストアドプロシージャを持っています。私は一時テーブルがすべてのセッションのためにユニークであることを理解していますが、私のアプリケーションがスレッドを使用していて、アプリケーションプールからの同じSQL接続を使用して、 ?同じ接続プール上の複数の要求にまたがって一意の一時表

答えて

2
CREATE PROCEDURE [dbo].[Mytestproc] 
AS 
    BEGIN 
     BEGIN TRANSACTION 

     CREATE TABLE #Hold 
     (
      ID INT, 
      VAL NVARCHAR(255) 
     ) 

     BULK INSERT #Hold 
     FROM 'C:\data.txt' 
     WITH 
      (
      FieldTermInAtOr ='|', 
      RowTermInAtOr ='\n' 
     ) 

     SELECT * 
     FROM #Hold 

     DROP TABLE #Hold 

     COMMIT TRANSACTION 
    END 

つのスレッドが接続を使用してこのストアドプロシージャを実行している一方で、その同じ接続は、接続プールで再利用することができない - これが共有の危険がありません。他のスレッドはこの接続を使用することができず、代わりに新しい接続を開きます。

さらに、ストアドプロシージャが終了する前に一時テーブルを削除する必要はありません。ストアドプロシージャ内で作成された一時テーブルは、プロシージャが終了すると自動的に削除されます。

+0

複数のアクティブな結果セット(MARS)を使用して、同じ接続で複数の要求を行うことができると考えましたが、読み取り専用の可能性がありますか? – newbie

+0

@newbie - MARSでは、複数の選択を並行して実行することしかできないため、コード内で明示的に接続オブジェクトを共有する必要があります。 –

+0

私はこれを要約すると思います - 「一方のスレッドが接続を使用していて、このストアドプロシージャを実行中ですが、同じ接続を接続プールで再利用することはできません」 – newbie

0

あなたのアプリケーションがこのストアドプロシージャを同時に呼び出していると、別々の接続であると考えられます。この場合、別々の一時テーブルになります。

ベストな方法はテストすることです。アプリケーションで同時呼び出しを行い、これらの接続を保持します。次に、sp_whoを実行して、接続がアプリケーションに複数あるかどうかを確認し、これらの一時テーブルの出力を表示します(異なるデータが含まれている場合)。

関連する問題