まず、SQLは私の強みではありません。私はそうのように、いくつかの種類によって、次の項目の数を追跡し一つのテーブルを持っている:SQL Serverは更新で2つのテーブルを増やす
declare @maxs as table
(
Equip int,
NextId int
);
-- initial id values
insert into @maxs (Equip, NextId) values (400, 40);
insert into @maxs (Equip, NextId) values (500, 50);
私はタイプのアイテムを作成する場合は「400」は、次のIdが40であり、それがにインクリメントする必要があります41.単一の追加の場合、それは十分に簡単です。私たちのプログラムはバッチで追加するので、ここに私の問題があります。
declare @t as table (Id int, Equip int, Descr varchar(20));
-- simulates the batch processing
insert into @t (Equip, Descr) values (400, 'Item 1');
insert into @t (Equip, Descr) values (400, 'Item 2');
insert into @t (Equip, Descr) values (500, 'Item 3');
-- generate the new id's in batch
UPDATE t
SET Id = (SELECT m.NextId + ROW_NUMBER() OVER (PARTITION BY t.Equip ORDER BY t.Equip))
FROM @t t
INNER JOIN @maxs m ON m.Equip = t.Equip
SELECT * FROM @t
のみ1行が400に対して返さので、ROW_NUMBERの両方のために同じであるので、これは、両方のアイテム1と同一のIDを有する項目2になります。 @maxsのNextId値をインクリメントし、@tの中のエントリを更新して、@maxsの400値に結合する2番目の行が次の値を持つようにする必要があります(ほとんどC#のx ++参照に似ています) 。 SQLでそれを行うためのきれいな方法はありますか?
ありがとうございます。
一時テーブルにテーブル変数から切り替えよう私の提案は、すべてのSQL Serverの上の数字をincementingを扱っていません。単純にID列を使用して、SQL Serverで大量の処理を実行させてください。 –
@ ZoharPeled要件によっては、連続した番号の付いたオブジェクトが必要です。例えば、ステートメントの番号は1から始まり、連続して増やす必要があります(これはアカウント番号ごとに異なります)。 –
@TT私は同意しますが、SQLサーバでそのように動作するように数値を取得することは、特にマルチユーザ環境では厄介なことがあります。ほとんどの場合、ID列が最適なオプションです。 –