3

SQL Serverのストアドプロシージャで一時テーブルを使用する場合は、次の方法をお勧めします。

1)一時テーブルを作成し、データを入力して使用し、ドロップします

CREATE TABLE #MyTable ( ... )

-- Do stuff

DROP TABLE #MyTable

2)存在するかどうかを確認し、存在する場合はドロップしてから、作成して使用します

IF object_id('tempdb..#MyTable') IS NOT NULL
DROP TABLE #MyTable

CREATE TABLE #MyTable ( ... )

3)それを作成し、スコープ外になったときにSQLServerにクリーンアップさせます

CREATE TABLE #MyTable ( ... )

-- Do Stuff

この回答とそれに関連するコメントを読みました。これは、SQL Serverがテーブルを切り捨てるが、時間を節約するために構造を維持する一時テーブルが再利用される状況で役立つ可能性があります。

私のストアドプロシージャはかなり頻繁に呼び出される可能性がありますが、含まれている列は数個しかないため、これが私の状況で実際にどれほど有利かはわかりません。

4

3 に答える 3

2

シナリオで、ある方法が別の方法よりも優れているかどうかをテストして確認できます。この再利用のメリットについて聞いたことがありますが、自分で大規模なテストを行ったことはありません。(私の直感は、作成した#tempオブジェクトを明示的に削除することです。)

単一のストアドプロシージャでは、テーブルが存在するかどうかを確認する必要はありません。同じ名前のテーブルを作成した可能性のある別のプロシージャからプロシージャが呼び出されている可能性がある場合を除きます。これが、#t、#x、#yなどを使用する代わりに、意味のある名前を#tempテーブルに付けることをお勧めする理由です。

于 2012-09-06T14:47:42.190 に答える
1

私はこのアプローチに従います:


IF object_id('tempdb..#MyTable') IS NOT NULL

DROP TABLE #MyTable

  CREATE TABLE #MyTable ( ... )

  // Do Stuff

IF object_id('tempdb..#MyTable') IS NOT NULL

DROP TABLE #MyTable

理由:sprocでエラーが発生し、作成された一時テーブルが削除されず、同じsprocが存在を確認して呼び出された場合、テーブルを作成できないというエラーが発生し、テーブルが正常に実行されない限り、正常に実行されません。ドロップしました。したがって、オブジェクトを作成する前に、必ずオブジェクトの存在を確認してください。

于 2012-09-06T17:51:55.613 に答える
0

一時テーブルを使用する場合、私の好みの方法は実際には1と2の組み合わせです。

  IF object_id('tempdb..#MyTable') IS NOT NULL
     DROP TABLE #MyTable

  CREATE TABLE #MyTable ( ... )

  // Do Stuff

  IF object_id('tempdb..#MyTable') IS NOT NULL
     DROP TABLE #MyTable
于 2012-09-06T15:05:48.983 に答える