いくつかのレコードを含むテーブルを作成し、そのテーブル内のすべてのレコードに対して一連の SQL ステートメントを実行したいと考えています。テーブルのデータを使用して、SQL ステートメントに値を設定します。
これにより、SQL を 1 回だけ記述してから、テーブルに入力したデータに対して実行することができます。
しかし、私はこれを行う方法がわかりません。テーブルをループするためにカーソルを使用する必要がありますか? 他の方法?
あなたが私に与えることができる助けやアドバイスをありがとう.
いくつかのレコードを含むテーブルを作成し、そのテーブル内のすべてのレコードに対して一連の SQL ステートメントを実行したいと考えています。テーブルのデータを使用して、SQL ステートメントに値を設定します。
これにより、SQL を 1 回だけ記述してから、テーブルに入力したデータに対して実行することができます。
しかし、私はこれを行う方法がわかりません。テーブルをループするためにカーソルを使用する必要がありますか? 他の方法?
あなたが私に与えることができる助けやアドバイスをありがとう.
CURSOR には関連するオーバーヘッドがありますが、テーブルをウォークスルーするのに適した方法です。彼らは完全に不必要な悪ではなく、彼らの場所を持っています。
WilliamB2 が提供した限られた情報では、CURSOR セットは、彼のデータをウォークスルーし、複数のダウンストリーム INSERT を生成するこの問題の良い解決策のように思えます。
はい、カーソルを使用できます。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番目のアプローチでは、元のテーブルで作業していません
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ます。