如何将Insert从select转换为upsert

时间:2017-06-01 15:51:05

标签: sql-server tsql upsert

如何将insert从select转换为upsert。我有以下代码将数据从一个数据库表插入到另一个数据库表中,我可以插入但是如果某些内容更改了任何不属于PK的字段。 WITESTCO.dbo.[WIBOMD]的主键是[bomItem], [bomRev], [bomEntry]

INSERT INTO WITESTCO.dbo.[WIBOMD] 
   ([bomItem], [bomRev], [bomEntry], [partId], [qty],[cmnt],[srcLoc],[dType],[lead],[lineNbr])
   select 
    [STOCK NO]    
  , u.rev
  , bomEntry = row_number() over (order by u.ordinal)
  , u.Partid
  , Qty='1'
  , cmnt = 'TEST'
  , srcLoc = 'TEST'
  , dType = '0'
  , lead = '0'
  , lineNbr = row_number() over (order by u.ordinal)
from [inserted]
  cross apply (values 
    ([bomRev],1,[BOM-WHEEL PN])
    ,([bomRev],2,[BOM - RIM])
    ,([bomRev],3,[BOM - SECONDARY DISC PN])
    ,([bomRev],4,[BOM - FIN DISC PN])
    ,([bomRev],5, [BOM - FLAT FIN DISC PN])
    ,([bomRev],6,[WHL BOM PART 1 PN])
    ,([bomRev],7,[WHL BOM PART 2 PN])
    ,([bomRev],8,[WHL BOM PART 3 PN])
    ,([bomRev],9,[WHL BOM PART 4 PN])
    ,([bomRev],10,[WHL BOM PART 5 PN])
    ,([bomRev],11,[COLOR-PN])

) u (rev, ordinal, partId)
where nullif(u.partId,'') is not null AND  NOT EXISTS(SELECT * FROM  WITESTCO.dbo.[WIBOMD] WHERE WITESTCO.dbo.[WIBOMD].[bomItem]=inserted.[STOCK NO] and WITESTCO.dbo.[WIBOMD].[bomRev]=inserted.[RevControl]);

2 个答案:

答案 0 :(得分:0)

使用common table expression,我们可以在wp_mail()中加入bomEntry

not exists()

或者,您可以使用子查询/派生表而不是公用表表达式。

答案 1 :(得分:0)

如果您使用的是sql server 2008+,则可以使用MERGE语句https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql

我有一个很难实现它,但没有架构或清楚地了解您的数据看起来像这个解决方案不太可能第一次工作。请将此更多地用作概念证明,而不是完全正常工作的代码。

Subject