1

エラーを回避するために多くの回答が得られるので、エラー処理を実行し、エラーを作成するテーブル行を検出する方法に主に関心があります。実際の問題を回避するために使用するのは、ストアドプロシージャでコーディングされます。


テーブルにないエントリに対して、ストアドプロシージャでSQLInsertステートメントを実行しています。

INSERT INTO dbo.t1
                      (col1, col2, col3, col4, col5)
    SELECT DISTINCT col1, col2, col3, col4, col5
    FROM         dbo.t2
    WHERE     (NOT EXISTS
                          (SELECT     col1, col2, col3, col4, col5
                            FROM      t1 AS Table_1
                            WHERE     (col1 = t2.col1) AND 
                                      (col2 = t2.col2) AND
                                      (col3 = t2.col3) AND
                                      (col4 = t2.col4) AND
                                      (col5 = t2.col5))) AND
                                       col2 = 'VALUE'

t1.col1+t1.col2およびt1.col3+t1.col4には、別のテーブルt3.col1+t3.col2との外部キー関係があります。

ストアドプロシージャは、外部キー関係に違反しているというエラーメッセージのスローを終了できません。つまり、t3にいくつかのエントリがありません。

メッセージ547、レベル16、状態0[...]INSERTステートメントがFOREIGN-KEY[..]と競合しています

私が知りたいのは、エラーを引き起こしているt2のTABLE ROWであり、最適にはこの行の値です。私はSQLエラー処理についてかなりグーグルで検索しましたが、エラーを発生させるコーディング行を提供する例しか見つかりませんでした-これは私にとって役に立たない情報です...

助けていただければ幸いです

4

6 に答える 6

1

エラーは非常に明確です。参照されているテーブルの主キー列にないFK制約のある列に値を挿入しようとしているように見えます。

dbo.t2投稿したクエリから、最初のテーブルに存在しないすべての値を挿入しようとしています。次に、演算子を使用して、にある値のうち、次のようなものには存在しないEXCEPT値のみを挿入できます。col1, col2, col3, col4, col5dbo.t2dbo.t1

INSERT INTO dbo.t1
                  (col1, col2, col3, col4, col5)
SELECT * FROM
(
    SELECT col1, col2, col3, col4, col5
    FROM         dbo.t2
    EXCEPT 
    col1, col2, col3, col4, col5
    FROM         dbo.t1
)

このようにして、に存在しない行のみがdbo.t1挿入されることを保証します。

重複エントリの原因となるデータを取得する場合は、を使用しINTERSECTてそれらを取得できます。

于 2012-09-06T09:30:58.660 に答える
0
INSERT INTO dbo.t1(col1, col2, col3, col4, col5)
SELECT DISTINCT col1, col2, col3, col4, col5
FROM dbo.t2 left join dbo.t1
on t2.col1=t1.col1 and
   t2.col2=t1.col2 and
   t2.col3=t1.col3 and
   t2.col4=t1.col4 and
   t2.col5=t1.col5 
where t1.col1 is null and t1.col2 is null and t1.col3 is null and t1.col4 is null and t1.col5 is null
于 2012-09-06T09:30:48.617 に答える
0

t2に存在しない値を持つ行がある可能性があると思いますt3。(そのため、参照に違反しています。)

t2に存在する値のみが含まれていることを確認してくださいt3

于 2012-09-06T09:32:03.820 に答える
0

データで内部結合を使用して、違反している行を削除してみてください。

于 2012-09-06T09:33:22.383 に答える
0

NOTINを使用してこれを試してください

  INSERT INTO TABLE_2  
 (id, name) SELECT t1.id,  t1.name   
  FROM TABLE_1 t1  WHERE t1.id NOT IN (SELECT id                        FROM TABLE_2) 
于 2012-09-06T09:35:08.300 に答える
0
SELECT column1, column2, column3
FROM Table2 T2
LEFT JOIN  Table1 T1 ON T1.col1 = T2.column1 and T1.col2 = T2.column2 and T1.col3=T2.column3
WHERE T1.col1 IS NULL and T1.col2 IS NULL and T1.col3 IS NULL
于 2012-09-06T10:00:36.103 に答える