1

動的SQL(ms sql 2005)を使用した2つのストアドプロシージャがあります。まず、一時テーブル (##Table) を作成し、データを入力します。2 番目の手順では、最初の手順で作成された一時テーブルからデータを選択します。

最初のsp:

set @cmd = 'create table ' + @tableName +
                            '(ORDERS_DT_ID int' +
                            ...
                            ',WAREHOUSE_RESULT numeric(15, 3)) ' +

       ' insert into ' + @tableName + ' ( ORDERS_DT_ID, ... WAREHOUSE_RESULT )' +
       ' select ro.ORDERS_DT_ID, ... ro.WAREHOUSE_RESULT ' +
         ' from WH_REMAINS_BY_ORDER_FN ( ' + cast(@orderId as varchar(10)) + ' ) as ro '

exec (@cmd)      

2 番目の sp (例):

set @cmd =  'select r.ORDERS_DT_ID, ... r.WAREHOUSE_RESULT' +
                     ' from ' + @tableName + ' as r'

exec (@cmd)

where @tableName - sp の入力パラメーター ( = '##Table' など)

私はasp.net mvcアプリケーションからその手順を使用します。最初のプロシージャを呼び出し、MSSMS から一時テーブルをチェックし (テーブルが存在する)、アプリケーションがブレークポイントで停止し (2 番目の SP の前)、次に 2 番目のプロシージャを呼び出し、テーブルが存在しません (ただし、1 番目と 2 番目のプロシージャの間にテーブルが存在します)。

var result = dataContext.firstSP(table, orderId).FirstOrDefault(); // create temp table and fill data (+ return status)

var data = dataContext.secondSP( table, orderId ).AsQueryable(); // before execute we have temp table (check from MSSMS) and we have error after execute that code.

2 番目の手順で一時テーブルを確認すると、テーブルが存在しないことがわかります。

if object_id ( N'tempdb.dbo.' + ltrim(@tableName) ) is null
begin
    exec dbo.firstSP @tableName, @orderId            
end

2 番目の SP を実行すると、最初の SP の一時テーブルが削除されるのはなぜですか?

4

2 に答える 2

2

グローバル一時テーブルは、作成中のセッションが終了するとすぐに削除され、別のセッションからアクティブにクエリされていません。

存続期間を制御したい場合は、永続テーブルを作成します (おそらく でtempdb)

于 2012-12-12T13:39:41.273 に答える
1

グローバル一時テーブルは、クエリを実行する開いている接続がない場合、自動的に削除されます。それが一番の原因です。個人的には、DB への 2 つの個別の呼び出しとしてこれを行うことはありません。

私のアドバイスは、最初の SP をテーブル値関数に変換することです。その後、2 番目の SP は単に TVF をクエリできます。これにより、2 つの別個のデータベース呼び出しを行うために DDL を実行する必要がなくなり、通常はより簡単になります。

それは、本当に一時テーブルが必要な場合です。この生成されたテーブルを 1 回以上使用したくない場合は、一時テーブルを使用しないでください。

于 2012-12-12T13:44:19.740 に答える