2

次のエラーが表示されます。

PRIMARY KEY 制約 'PK_ss_student_grade' に違反しています。オブジェクト 'dbo.ss_student_grade' に重複するキーを挿入できません。重複キーの値は (301, 1011, 24801, 33) です。

挿入前にテーブルをチェックすると、そのような主キーを持つレコードはありません。

挿入は C# コードを介して行われ、コードが 1 回だけ実行されるようにしました。エラーが発生した後でも、テーブルを確認しても、そのような主キーを持つレコードは取得されません。

注: トリガーはテーブルへの挿入で実行されますが、ログ ファイルに書き込むだけで、データベース内のデータには影響しません。

キーが既に存在すると SQL を混乱させる原因は何ですか?

EDIT:コードは、次のことを行うプロシージャを呼び出します

 insert into ss_student_grade(sg_school_code,sg_acad_year,sg_serial_no,sg_student_key,sg_original_grade,sg_grade,sg_school_grade,sg_category_type,sg_operator,sg_datetime)
 select pg_school_code, pg_acad_year, et_serial_no, mep_student_key, pg_grade,pg_grade,pg_grade,'Original', SYSTEM_USER, @ExamCreationDate
  from #StudentGrades
  where not exists (select 1 from ss_student_grade where sg_school_code = pg_school_code and sg_acad_year = pg_acad_year and sg_serial_no = et_serial_no and sg_student_key = mep_student_key)

SQL Server 2008 R2 と Visual Studio 2010 Ultimate を使用しています

4

1 に答える 1

3

一時テーブル #StudentGrades を確認します。一意の主キーを構成するデータの重複が含まれている可能性があります。SQL はセットベースであるため、存在しない場所ではこれを防ぐことはできません。

ほとんどの場合、PK の定義を変更するか、#StudentGrades テーブルの内容を変更するか、select ステートメントを変更して一意の行を指定する必要があります。

これは、たとえば、GROUP BY または ROW_NUMBER() OVER(PARTITION BY column ORDER BY column) を使用している可能性があります。

于 2013-05-13T11:40:51.947 に答える