0

いくつかのレコードを含むテーブルを作成し、そのテーブル内のすべてのレコードに対して一連の SQL ステートメントを実行したいと考えています。テーブルのデータを使用して、SQL ステートメントに値を設定します。

これにより、SQL を 1 回だけ記述してから、テーブルに入力したデータに対して実行することができます。

しかし、私はこれを行う方法がわかりません。テーブルをループするためにカーソルを使用する必要がありますか? 他の方法?

あなたが私に与えることができる助けやアドバイスをありがとう.

4

3 に答える 3

1

CURSOR には関連するオーバーヘッドがありますが、テーブルをウォークスルーするのに適した方法です。彼らは完全に不必要な悪ではなく、彼らの場所を持っています。

WilliamB2 が提供した限られた情報では、CURSOR セットは、彼のデータをウォークスルーし、複数のダウンストリーム INSERT を生成するこの問題の良い解決策のように思えます。

于 2012-06-28T04:09:37.717 に答える
0

はい、カーソルを使用できます。while ループを使用することもできます

declare @table as table(col1 int, col2 varchar(20))

declare @col1 int
declare @col2 varchar(50)

declare @sql varchar(max)

insert into @table
SELECT col1, col2 FROM OriginalTable

while(exists(select top 1 'x' from @table)) --as long as @table contains records continue
begin
   select top 1 @col1=col1, @col2=col2 from @table

   SET @sql = 'INSERT INTO Table t VALUES('+cast(@col1 as varchar)+')'


   delete top (1) from @table --remove the previously processed row. also ensures no infinite loop
end 

カーソルにはオーバーヘッドが付随していると思います。

この2番目のアプローチでは、元のテーブルで作業していません

于 2012-06-28T03:50:17.577 に答える
0

INSERT...SELECTたぶん、ループの代わりに使用できます:

INSERT INTO target_table
SELECT
    some_col,
    some_other_col,
    'Some fixed value',
    NULL,
    42,
    you_get_the_idea
FROM source_table
WHERE source_table.you_get_the_idea = 1

上の列SELECTは、ターゲット テーブルの構造と一致する必要があります (ある場合のように、int/identity pk を省略できidます)。

最適なオプションがこれであるか、ループであるかは、ループ内にデータを入力するテーブルの数によって異なります。ほんの少しの場合、私は通常、 に固執しINSERT...SELECTます。

于 2012-06-28T04:05:26.510 に答える