如果不存在则插入记录,然后在一个查询中使用标识进行更新

时间:2013-06-12 18:02:10

标签: sql tsql sql-server-2008-r2

我有2张桌子。

create table Sales 
(CustomerKey int
,ProductKey int
,CustomersProductsKey int
,SalesAmount decimal(19,4))

Create Table CustomersProducts
(CustomersProductsKey int IDENTITY(1,1),
CustomerKey int,
ProductKey int,
Attribute1 int,
Attribute2 varchar(max))

目前,当我向sales表添加数据时,我需要将任何新的customerkey productkey组合插入CustomersProducts表,然后使用生成的CustomersProductsKey标识值更新sales表。这很有效。

无论如何,我可以一步到位吗?我不知道Merge是否可以在相同但不匹配的步骤上进行插入和更新。

我也可能只是以错误的方式看待这个。

谢谢,

编辑:

您可以想象,我需要使用代理键的事实是设计的一部分。 BO报告需要它。否则就根本不需要CustomersProductsKey。

1 个答案:

答案 0 :(得分:0)

如果只添加一步才能使其正常工作, 我认为我们需要创建另一个表并在新表和CustomersProducts上创建触发器

create table CustomersSalesProducts
(CustomerKey int
,ProductKey int
,SalesAmount decimal(19,4)
,Attribute1 int
,Attribute2 varchar(max))


create trigger test1 on CustomersSalesProducts After Insert
as 
begin 
  insert Sales select CustomerKey , ProductKey , 0, SalesAmount from inserted    
  insert CustomersProducts select CustomerKey , ProductKey , Attribute1, Attribute2 from inserted     
end 
go

create trigger test2 on CustomersProducts after insert
as 
begin 
  Update Sales set CustomersProductsKey = inserted.CustomersProductsKey
  from inserted , Sales 
  where inserted.CustomerKey = Sales.CustomerKey
    and inserted.ProductKey = Sales.ProductKey     
end 
go

测试脚本:

insert CustomersSalesProducts select 3,3,300,3,'Attribute2'