我正在使用Microsoft SQL Server。我想使用这两个函数来解析进入我的表的数据。所以我使用交叉应用和外部应用在一起。使用交叉应用和外部应用时违反主键约束
CROSS APPLY CA_Parse_CorpActnDtls_fn(MessageID) ent
outer apply CA_Parse_CorpActnOptnDtls_fn(ev.MessageID) cod
但是,当我这样做是抱怨以下埃罗:
违反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
你可以看到,我还需要第二功能CA_Parse_CorpActnOptnDtls_fn(ev.MessageID) 因为我想用我的用户撰写的LSCI_DateOfRecord数据定义功能。那么当我使用这两个函数时,有什么办法可以避免重复?
或者是否有任何方法分别为第二个函数CA_Parse_CorpActnOptnDtls_fn(ev.MessageID)为LSCI_DateOfRecord和RoundingDesc建立一个临时列表?然后我可以更新表格。
任何帮助,非常感谢。
可以将它们插入到一个临时表,删除重复的,并插入到真正的表? – DVT
有几种方法可以解决这个问题。但他们都取决于你的意思是重复的。它只是一个重复的键值或是整行被重复?也许一个简单的小组可以解决问题。也许别的东西。 –
一些示例数据在这里将会走很长的路,就像您所拥有的那些2个UDF的定义一样。这将帮助我们理解您定义为重复的内容。请告诉我们你得到什么(作为选择声明)以及你期望看到什么 – Eli