0

ストアドプロシージャがあります

DECLARE cursor FOR SELECT [FooData] From [FooTable];
OPEN cursor ;  
FETCH NEXT FROM cursor INTO @CurrFooData;
WHILE @@FETCH_STATUS = 0
BEGIN
  SELECT @CurrFooData AS FooData;
  INSERT INTO Bar (BarData) VALUES(@CurrFooData);
  FETCH NEXT FROM cursor INTO @CurrFooData;
END;
CLOSE cursor 
DEALLOCATE cursor 

しかし、結果として、1つではなく、たくさんのテーブルがあります。「FooData」列とすべての「@CurrFooData」行を含む 1 つのテーブルを返すにはどうすればよいですか?

4

2 に答える 2

1

ドミトリー、あのカーソルを一斉に取り除くように努めるべきだと思います。FooData12 番目の例では、2 つのフィールドとを選択していますFooData2が、最終的には値を挿入するだけです....

2 番目のクエリを簡単に書き直すことができます。次のようになります。

INSERT INTO Bar (BarData) 
    SELECT FooData1 FROM FooTable

カーソル全体とすべてが実際に行っていることはそれだけです。

どんな犠牲を払ってもカーソルを避けるようにしてください - 99% の時間、カーソルは必要ありません - データの SETS で考え始めてください - SQL の手続き型ループとカーソルに固執しないでください - それはちょうど良い一致ではありません!

挿入したものを出力する必要がある場合は、次のOUTPUT句を使用します。

INSERT INTO Bar (BarData) 
    OUTPUT Inserted.* 
    SELECT FooData1 FROM FooTable
于 2010-04-04T16:00:16.267 に答える
1

今挿入したデータを出力したいということですか?その場合、およびSQL Server 2005より前のバージョンの SQL Server を使用している場合は、必要な値を次のように一時テーブルに詰め込むことができます。

Create Table #FooTemp ( FooData ... )

Insert #FooTemp( FooData )
Select FooData
From FooTable

Insert Bar( BarData )
Select FooData
From #FooTemp

Select FooData
From #FooTemp

このアプローチの欠点は、一時テーブルが原因で、ストアド プロシージャを実行するたびに再コンパイルが発生する可能性があることです。

SQL Server 2000+ を使用している場合は、上記と同じことをテーブル変数でのみ行うことができます。

Declare @FooTemp Table ( FooData ... )

Insert @FooTemp( FooData )
Select FooData
From FooTable

Insert Bar( BarData )
Select FooData
From @FooTemp

Select FooData
From @FooTemp

SQL Server 2005 以降を使用している場合は、次のように OUTPUT 句を使用できます。

Insert Bar( BarData )
 OUTPUT inserted.BarData
Select FooData
From FooTable
于 2010-04-04T16:59:56.713 に答える