挿入スクリプト(重複を避ける)をバッチしようとしていて、プライマリキーを持たないテーブルがいくつか出てきています(私は知っています...私はそれらを作成せず、 )。基本的には、私が必要とする行をつかんで、一時テーブル([TempTable]
)に入れ、それらの値をいくつか更新しました。SQL別のレコードを挿入する
[TempTable]
から[OriginalTable]
までのバッチの値をDISTINCT TOP
に再挿入する必要があります。これを行うには、私が作成したtempテーブルのカラムが必要です(これは[ValuesInserted]
としましょう)。これはちょうど挿入されたカラムを指定します。
DISTINCT
の値をTOP
を使用して元のテーブルに格納すると、INSERT
の文が実行されます。
INSERT INTO [OriginalTable]
SELECT DISTINCT TOP (1000) *
FROM [TempTable]
次に、ちょうど挿入されたレコードのValuesInsertedを1に設定するようにtempテーブルを更新します。 私がこだわっているところである:
UPDATE /*TOP (1000) - Doesn't work*/ [TempTable]
SET [ValuesInserted] = 1
???
(TOP
を使用して)私の次のINSERT
文は、レコードの前のセットをキャプチャしないように、そして、私は一時テーブルから、それらのレコードを削除することになります。
DELETE
FROM [TempTable]
WHERE [ValuesInserted] = 1
私がいる主な問題は、ただ単にTOP (1000)
行でUPDATE
を実行している、[TempTable]
で重複を有することができるすべてのレコードをキャプチャしていないということです。 [TempTable]
という2つのコピーのすべての列に対してINNER JOIN
を実行することはできません。これは、動的SQLを使用する多くの異なる表で実行されているためです。基本的には、スクリプトは汎用的である必要があります(テーブルに固有のものではありません)が、プライマリキーが存在しないものと想定してください。
Val1 Val2 ValuesInserted
1 1 0
1 2 0
1 3 0
1 4 0
1 5 0
1 6 0
1 7 0
1 8 0
1 9 0
1 1 0 <--Duplicate
2 1 0
2 2 0
2 3 0
2 4 0
2 5 0
2 6 0
2 7 0
2 8 0
2 9 0
2 1 0 <--Duplicate
3 1 0
3 2 0
3 3 0
3 4 0
3 5 0
3 6 0
3 7 0
3 8 0
3 9 0
3 1 0 <--Duplicate
1 2 0 <--Duplicate
1 3 0 <--Duplicate
のみ最初の5つのレコードが更新されます。この上記のデータセットにUPDATE TOP (5)
を行う::私は一致するすべてのレコードを更新する必要があり
Val1 Val2 ValuesInserted
1 1 1 <--Updated
1 2 1 <--Updated
1 3 1 <--Updated
1 4 1 <--Updated
1 5 1 <--Updated
1 6 0
1 7 0
1 8 0
1 9 0
1 1 0 <--Duplicate
2 1 0
2 2 0
2 3 0
2 4 0
2 5 0
2 6 0
2 7 0
2 8 0
2 9 0
2 1 0 <--Duplicate
3 1 0
3 2 0
3 3 0
3 4 0
3 5 0
3 6 0
3 7 0
3 8 0
3 9 0
3 1 0 <--Duplicate
1 2 0 <--Duplicate
1 3 0 <--Duplicate
を
次の一般的なサンプルでは、アイデアをキャプチャ上位5のレコードは次のようになります。
Val1 Val2 ValuesInserted
1 1 1 <--Updated
1 2 1 <--Updated
1 3 1 <--Updated
1 4 1 <--Updated
1 5 1 <--Updated
1 6 0
1 7 0
1 8 0
1 9 0
1 1 1 <--Updated
2 1 0
2 2 0
2 3 0
2 4 0
2 5 0
2 6 0
2 7 0
2 8 0
2 9 0
2 1 0 <--Duplicate
3 1 0
3 2 0
3 3 0
3 4 0
3 5 0
3 6 0
3 7 0
3 8 0
3 9 0
3 1 0 <--Duplicate
1 2 1 <--Updated
1 3 1 <--Updated
このサンプルのアイデアの仕事、私は私の特定のケースに適用することができます。
私はこれに完全に間違っているのですか、何か不足していますか?私は、がというリソースを狙っているわけではないというのが、スクリプトがバッチ処理され、インパクトの大きいサーバー上の非常に大きなデータベースで実行されているためです。
これに最も近いトピックは、 Using Distinct in SQL Updateです。 しかし、TOP
を使用すると、指定された回答は機能しません。
編集:これは明らかに最初は明らかではありませんでした。私がやっている最初のことは、[OriginalTable]
から行をつかんで、[TempTable]
に入れることです。これらの行は、最初は一意です。ただし、上記のサンプルのようなデータを生成する値の一部を変更する更新を実行します。から、DISTINCT
の行を取得し、[OriginalTable]
に再挿入する必要があります。
あなたがここに持っている最大の問題は、あなたがトップを使用しているありますあなたは注文していません。あなたが注文することなく、どの行が選択されるかを決める方法がありません。 https://blogs.msdn.microsoft.com/conor_cunningham_msft/2008/08/27/no-seatbelt-expecting-order-without-order-by/ –
これは[tag:batch-file]にリンクされていません。 .. – aschipfl