2011-12-28 13 views
0

重複レコードの問題に直面しています。並行性の問題。そのために影響を与える複数のテーブルがありますが...私は手順を使用して、レコード別のテーブルを挿入していたレコードを検索した後重複レコード

SELECT TOP 1 certid, certiname 
    FROM certificate 
WHERE issued = 0 
    AND year = 2011 

を:私は、データベースからレコードを取得しています。私はまた、SQLトランザクションを使用して、すべてのトランザクションに影響を与えるか、なし、commitまたはRollbackを使用しました。この手順では、私はまた、証明書に

UPDATE certificate 
SET issued = 1 
WHERE certid = @certid 

を更新していますが、同じ証明書が...

どのように私はこの問題を回避することができ、複数のポリシーを発行しましたか?

+0

FROM INSERT INTO表1 SELECT *を行く

TRUNCATE表表1に行きます。私はあなたが[キューとしてテーブルを使用する](http://rusanu.com/2010/03/26/using-tables-as-queues/)しようとしているという曖昧な考えがありますが、これは難しい/不可能なことです。 –

+0

単語は「記録」です。それは 'recored'または 'reocord'ではありません。 –

答えて

1

同時プロセスで重複のない行を1つ選択する場合は、ヒントが必要です(ROWLOCK, READPAST, UPDLOCK)。詳細:SQL Server Process Queue Race Condition

あなたは同じトランザクションで/更新を選択したい場合は、OUTPUT句

UPDATE TOP (1) certificate WITH (ROWLOCK, READPAST, UPDLOCK) 
SET issued = 1 
OUTPUT INSERTED.certid, INSERTED.certiname 
-- or OUTPUT INSERTED.certid, INSERTED.certiname INTO @SOmeTableVariable 
WHERE issued = 0 
    AND year = 2011 
+0

私はあなたの証明書になるときに、このステートメントは常に1つのレコードを更新するため、ローカル変数にOUTPUT INSERTED.certid、INSERTED.certinameを設定することができますか?なぜローカル変数に値を格納したいのですか? –

+0

@AbrarAhmad:テーブル変数をロードしてから選択するか、それに参加する必要があります。 – gbn

0

IF EXISTSを使用(タイプ= 'U' と名= 'Temp_Table1 sysobjectsにSELECT * FROM 「) が行く ドロップテーブルTemp_Table1 エンドを開始 選択* は行か表1からTemp_Table1に TRUNCATE TABLEのTemp_Table1 行く CREATE UNIQUE INDEX unqT ON Temp_Table1 IGNORE_DUP_KEYWITH(のid DESC)のid DESC BY表1のオーダーから INSERT INTO Temp_Table1 SELECT *を行くが はより良いあなたがやろうとしているかを説明してくださいTemp_Table1