2017-08-15 42 views
0

Microsoft SQL Serverを使用していました。私は両方の関数を使用してテーブルに入るデータを解析したい。だから私はクロス適用と外側適用を一緒に使用します。クロス適用と外部適用を併用する場合のPRIMARY KEY制約の違反

CROSS APPLY CA_Parse_CorpActnDtls_fn(MessageID) ent 
outer apply CA_Parse_CorpActnOptnDtls_fn(ev.MessageID) cod 

しかし、私はこれをしなかったときには、以下のERRO文句:PRIMARY KEY制約 'PK_AfterParse_CA_Events' の

違反を。オブジェクト 'dbo.AfterParse_CA_Events'に重複キーを挿入できません。重複するキー値は(105818432,37819929)です。 ステートメントが終了しました。全体のT-SQLコードは次のように見えます

insert into AfterParse_CA_Events (
      EventID 
      ,MessageID 
      ,cdtprFunction 
      ,CreationDate 
      ,MsgDefIdr 
      ,EventType 
      ,CFI 
      ,EventProcessingType 
      ,MndtryVlntryEvtTp 
      ,RecordDate 
      ,EffectiveDate 
      ,DueBillRdmDate 
      ,CUSIP 
      ,LSCI_DateOfRecord 
      ,RoundingDesc 

     ) 

    SELECT ent.EventID 
      ,ent.MessageID 
      ,ent.cdtprFunction 
      ,ent.CreationDate 
      ,ent.MsgDefIdr 
      ,ent.EventType 
      ,ent.CFI 
      ,ent.EventProcessingType 
      ,ent.MndtryVlntryEvtTp 
      ,ent.RecordDate 
      ,ent.EffectiveDate_Cmpny 
      ,ent.DueBillRdmDate 
      ,ent.CUSIP 
      ,ROXSQL.dbo.GetNthTradeDay_fn(
      case when ent.EventProcessingType = 'DISN' 
       then COALESCE (ent.ExDividendDate, ent.RecordDate) 
       ELSE COALESCE(ent.EffectiveDate_Xchg, ent.EffectiveDate_Cmpny,cod.EarliestPaymentDate_Secu,cod.PaymentDate_Secu ,cod.PaymentDate_Cash) 
      END,-1) AS LSCI_DateOfRecord 
      ,cod.RoundingDesc 


    FROM #EventsToDo ev 
    CROSS APPLY CA_Parse_CorpActnDtls_fn(MessageID) ent 
    outer apply CA_Parse_CorpActnOptnDtls_fn(ev.MessageID) cod 

あなたは私のユーザー定義されたを使用してLSCI_DateOfRecordデータを構成したいので、私はCA_Parse_CorpActnOptnDtls_fn(ev.MessageID) 第2の機能を必要とすることがわかります関数。 2つの関数を一緒に使用すると重複を避ける方法はありますか?

または、2番目の関数CA_Parse_CorpActnOptnDtls_fn(ev.MessageID)からLSCI_DateOfRecordとRoundingDescの一時リストを個別に作成する方法はありますか?そして、私はテーブルを更新することができます。

ご協力いただきまして誠にありがとうございます。

+0

を使用して、単純化したデモのですか? – DVT

+0

これにはいくつかの方法があります。しかし、それらはすべてあなたが複製物を意味するものに依存しています。重複したキー値か、重複している行全体ですか?たぶん単純なグループで問題を解決するだろう。多分何か。 –

+0

サンプルデータの中には、あなたが持っている2つのUDFの定義と同じく、長い道のりがあります。これは、あなたが複製として定義するものを理解するのに役立ちます。あなたが何を得ているか(選択声明として)、あなたが見たいと思っているものを提示してください。 – Eli

答えて

0

エラーとSQLコードを見ると、それ自体が問題を引き起こしているAPPLY演算子ではありません。 1つまたは両方の関数がEvenID & MessageIDのセットに対して1つ以上の行を返しているということです。それはPK違反の原因です。以下は

あなたは、一時テーブルにそれらを挿入し、重複を削除し、実際のテーブルに挿入することができ、文字列スプリッタ機能(DelimitedSplit8K

IF OBJECT_ID('tempdb..#EventsToDo ', 'U') IS NOT NULL 
DROP TABLE #EventsToDo ; 
GO 

CREATE TABLE #EventsToDo (
    EventID BIGINT NOT NULL, 
    MessageID BIGINT NOT NULL, 
    MessageText VARCHAR(1000) NOT NULL 
    ); 
GO 

INSERT #EventsToDo (EventID, MessageID, MessageText) VALUES 
    (105818432, 37819929, 'Part 1,Part 2,Part 3,Part 4,Part 5'); 
GO 

----------------------------------------------------------------- 

-- create the AfterParse_CA_Events table with PRIMARY KEY (EvenID, MessageID)... 
IF OBJECT_ID('tempdb..#AfterParse_CA_Events', 'U') IS NOT NULL 
DROP TABLE #AfterParse_CA_Events; 
GO 

CREATE TABLE #AfterParse_CA_Events (
    EvenID BIGINT NOT NULL, 
    MessageID BIGINT NOT NULL, 
    MessagePart VARCHAR(1000) NULL 
    PRIMARY KEY (EvenID, MessageID) 
    ); 
GO 

--=============================================================== 

-- see what happens when we try to insert the parsed message values 
-- into AfterParse_CA_Events while it has a PK of (EvenID, MessageID)... 
INSERT #AfterParse_CA_Events (EvenID, MessageID, MessagePart) 
SELECT 
    etd.EventID, 
    etd.MessageID, 
    dsk.Item 
FROM 
    #EventsToDo etd 
    CROSS APPLY dbo.DelimitedSplit8K(etd.MessageText, ',') dsk; 
GO 

--=============================================================== 
-- execute the code below in a separate execution 
--=============================================================== 

-- now, let's modify the AfterParse_CA_Events table so that we have "MessagePartID" 
-- and make that part of the PK 
IF OBJECT_ID('tempdb..#AfterParse_CA_Events', 'U') IS NOT NULL 
DROP TABLE #AfterParse_CA_Events; 
GO 

CREATE TABLE #AfterParse_CA_Events (
    EvenID BIGINT NOT NULL, 
    MessageID BIGINT NOT NULL, 
    MessagePartID INT NOT NULL, 
    MessagePart VARCHAR(1000) NOT NULL 
    PRIMARY KEY (EvenID, MessageID, MessagePartID) 
    ); 
GO 

--=============================================================== 

-- Now let's try the insertion again... 
INSERT #AfterParse_CA_Events (EvenID, MessageID, MessagePartID, MessagePart) 
SELECT 
    etd.EventID, 
    etd.MessageID, 
    dsk.ItemNumber, 
    dsk.Item 
FROM 
    #EventsToDo etd 
    CROSS APPLY dbo.DelimitedSplit8K(etd.MessageText, ',') dsk; 
GO 

--=============================================================== 

-- check the inserted values... 
SELECT 
    * 
FROM 
    #AfterParse_CA_Events apce; 

HTH、ジェイソン

関連する問題