このストアドプロシージャは、重複キー(フィールド、名前)のpk制約に違反するため、トランザクションが同時に発生すると失敗することがよくあります。私は、
holdlock、
rowlockとbegin/commitトランザクションを試行していますが、同じエラーが発生します。SQL Server MERGEコマンド重複pkエラー
私はinsert文を実行しようとしていますが、同じキー(フィールド、名前)を持つレコードが存在する場合は代わりにそれを更新してください。
パフォーマンスは重要なので、私は一時テーブルソリューションを避けようとしています。
MERGE Fielddata AS TARGET
USING (VALUES (@Field, @Name, @Value, @File, @Type))
AS SOURCE (Field, Name, Value, File, Type)
ON TARGET.Field = @Field AND TARGET.Name = @Name
WHEN MATCHED THEN
UPDATE
SET Value = SOURCE.Value,
File = SOURCE.File,
Type = SOURCE.Type
WHEN NOT MATCHED THEN
INSERT (Field, Name, Value, File, Type)
VALUES (SOURCE.Field, SOURCE.Name, SOURCE.Value, SOURCE.File, SOURCE.Type);
EDIT:24時間シリアライズ可能/ホールドロックによるテスト。 30分後:エラーなし。
EDIT 2:WITH (SERIALIZABLE)
/SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
は、重複したキーの問題を効果的に解決し、私たちのケース/シナリオで少しのコストがかかります。
にとってブロックソースだけでなく、範囲だけでなく**必要があります**は、それを過大評価。私の好みは、特定のステートメントに 'HOLDLOCK'ヒントを追加することです。 –
HOLDLOCKは同じ結果を返します –
これは事実上同じでしょうか? '= TARGET.Field ON(VALUES(@Field、@Name、@value、@file、@Type)) 源として(フィールド、名前、値、ファイル、タイプ) を使用して、ターゲット AS Fielddata WITH HOLDLOCKをMERGE @FieldとTARGET.Name = @Name MATCHED THEN UPDATE 設定値= SOURCE.Value、 ファイル= SOURCE.File、 タイプ= SOURCE.Type THEN INSERT(フィールド、名前、値を一致していません、ファイル、タイプ) VALUES(SOURCE.Field、SOURCE.Name、SOURCE.Value、SOURCE.File、SOURCE.Type); ' – LochNess