6

単一のレコードを既存のテーブルに挿入しようとすると、主キー制約違反エラーが発生します。

最初に問題が発生したのはマージ ステートメント内でしたが、レコードを単独で挿入しようとすると問題を再現できます。

主キーは、約 20 個の列値の値の連結で hashbytes 関数から生成された varbinary(20) 値にあります。挿入しようとしている varbinary(20) 値はターゲット テーブルに存在せず、ソース テーブルに 1 回しか存在しません。実際の列の値をフィルタリングすると、結果は同じです。ソースに 1 レコード、ターゲットにゼロ レコード。

ターゲット表には 101 178 878 行があります。主キーはテーブルのクラスター化インデックスではなく、クラスター化インデックスとして機能する bigint ID 列があります。ターゲットにもソースにもトリガーはありません。照合順序はどこでも同じです (Danish_Norwegian_CI_AS)。インスタンスは SQL Server 2008 R2、Standard Edition です。

私は今、完全に立ち往生しています。誰かが助けてくれることを願っています。

読んでくれてありがとう :-)

これは失敗する値です: 0x0571F5F713CF220BB0DB057BBCE7E158CA6F89C0

ターゲットでは、次の値が失敗した値に最も近い値です。失敗したものに等しい価値はありません。

0x0571F5F1238704E1A9D612F0A1648766B769E2AE 0x0571F5F713CF220BB0DB057BBCE7E158CA6F89C0 -- 失敗する値 0x0571F608CBE12A007F3DC3736D2F03D90ECCF3F7

編集:データベースに予期しない動作を引き起こす破損の問題があります。

4

2 に答える 2

0

あなたの答えは間違いなくエラーの中にあります.原因を見つけるために私がすること(ロールバックを伴うトランザクションの中で)

jsut an insert ではなく、 update と insert を使用してマージを実行してみてください。OUTPUT セクションのマージを使用して、実際に行っていること (更新または挿入) を示すコードを生成します。必要な場合はマージの構文

更新を取得し、影響を受ける行が 0 の場合は、破損の問題に対して失われたベテルと戦っています。

破損が統計にある場合は、インデックスをスクリプト化して削除し、まだ残っている統計を削除し、インデックスを再度生成して、まだ問題があるかどうかを確認します。

お役に立てば幸いです

ウォルター

于 2014-02-15T11:44:56.827 に答える