-1

このスクリプトを使用すると、ストアド プロシージャで実際に問題が発生します。

    INSERT INTO #tr_TxnDetails       
    SELECT 
        b.pid,
        b.etc
    FROM tbl_SomeTableA as a
    JOIN tbl_SomeTableB as b ON a.etc = b.etc 
        AND a.SomeColumn = b.SomeColumn 

    -- This is throwing error: Violation of PRIMARY KEY constraint. Cannot insert duplicate key in object 'dbo.tr_TxnDetails'. 
    INSERT INTO tr_TxnDetails
    ([id], [etc])
    SELECT  a.[id],
            a.[etc]
    FROM #tr_TxnDetails as a
    WHERE not exists (select 1 from tr_TxnDetails as b where a.[id] = b.[id]);

INSERT INTOduringステートメントtr_TxnDetailsが同じ主キーを持つ行を挿入していないことを確認するにはどうすればよいpidですか?

4

3 に答える 3

0
INSERT INTO #tr_TxnDetails       
SELECT 
    b.pid,
    b.etc
FROM tbl_SomeTableA as a
JOIN tbl_SomeTableB as b ON a.etc = b.etc 
    AND a.SomeColumn = b.SomeColumn 
  WHERE b.pid NOT IN (select distinct id from tr_TxnDetails) --<<--

INSERT INTO tr_TxnDetails
([id], [etc])
SELECT  a.[id],
        a.[etc]
FROM #tr_TxnDetails as a
于 2012-12-09T21:02:59.863 に答える
0

最初のINSERT ... SELECTステートメントが重複を生成し、これらの重複が 2 番目の選択で主キー エラーを引き起こしていると思います。あなたのWHERE EXISTS句は、既存の行の複製である複製の挿入を防ぐだけです。

クエリについては後で説明しますが、次の一連のステートメントを使用すると、このエラーが非常に簡単に発生する可能性があることを示すだけです。

create table TableA
(
  Pid INT PRIMARY KEY,
  etc INT
 );


INSERT INTO TableA
SELECT 1, 0
UNION 
SELECT 1, 2

ここにエラーがあります:

Violation of PRIMARY KEY constraint 'PK__TableA__C57059387F60ED59'. Cannot insert duplicate key in object 'dbo.TableA'.: INSERT INTO TableA SELECT 1, 0 UNION SELECT 1, 2

クエリに戻ると、単純な書き直しは、クエリがDISTINCT行のみを返すようにすることです。

INSERT INTO #tr_TxnDetails       
SELECT DISTINCT
    b.pid,
    b.etc
FROM tbl_SomeTableA as a
JOIN tbl_SomeTableB as b ON a.etc = b.etc 
    AND a.SomeColumn = b.SomeColumn 

INSERT INTO tr_TxnDetails
([id], [etc])
SELECT  a.[id],
        a.[etc]
FROM #tr_TxnDetails as a
WHERE not exists (select 1 from tr_TxnDetails as b where a.[id] = b.[id]);

これでうまくいくはずです。

もう1つのポイントは、あなたの例では、これら2つのステートメント間の他の処理など、正当な理由がない限り、一時テーブルステップを廃止する必要があるということです。書き換えられたクエリは次のとおりです。

INSERT INTO tr_TxnDetails       
SELECT DISTINCT
        b.pid,
        b.etc
FROM tbl_SomeTableA as a
JOIN tbl_SomeTableB as b ON a.etc = b.etc 
     AND a.SomeColumn = b.SomeColumn 
WHERE not exists (
    select 1 
    from tr_TxnDetails as c 
    where a.[id] = C.[id]
);
于 2012-12-09T23:41:45.940 に答える
0
DECLARE @ChoiceID INT 

SET @ChoiceID = (SELECT MAX([CHOICE_ID]) FROM BI_QUESTION_CHOICE) -- FOR SOMETABLE.ID

INSERT BI_QUESTION_CHOICE
                (
                    [choice_id],
                    [choice_descr],
                    [sequence],
                    [question_id],
                    [is_correct],
                    [created_by],
                    [created_dt],
                    [modified_by],
                    [modified_dt]
                )
                (SELECT @ChoiceID+ROW_NUMBER() OVER (ORDER BY @ChoiceID),  
                    pref.value('(ChoiceText/text())[1]', 'varchar(50)'),  
                    pref.value('(Sequence/text())[1]', 'varchar(50)') ,
                    @QuestionID, 
                    pref.value('(IsCorrect/text())[1]', 'bit'),
                    'mbathini',  
                     GETDATE(),  
                    'mbathini', 
                    GETDATE()  
                FROM @xmlstring.nodes('/ArrayOfBI_QA_ChoiceEntity/BI_QA_ChoiceEntity') AS Responses(pref))
于 2015-12-14T09:39:36.143 に答える