0

我正在绑定 wright 程序,该程序将检查我的历史表并重写其中的记录。它必须替换本月插入的记录,并且仅当它们在新插入中重复时。

现在我有这个程序,它只是复制了状态 id 为 1 和 2 的客户端,但如果我再次调用它,它将重复记录。

create procedure sp_MonthlyInsertInHistory
as

INSERT History( ClientId, CategCode)
  SELECT  ClientId, CategCode   
  FROM dbo.Clients 
  where StatusID in (1,2)
go

历史表看起来像

Historyid(int) auto increment, ClienID (int), CategCode (varchar), RecordDate (date)GETDATE();

    1, 11, SR, 2013-02-01
    2, 12, CH, 2013-02-01
    3, 11, SR, 2013-03-01
    4, 12, CH, 2013-03-01

如果我将运行此过程,它应该删除记录11, 1, 2013-03-01并将其替换为11, 1, 2013-03-18当前日期,如果 clientid 12 现在不在 statusid 1 或 2 中但它已经在表中,它应该留在那里。但是,如果记录不是在本月创建或不是在插入语句中的选择中创建,则不应删除记录。(例如新客户)。我希望你能理解我的解释。任何帮助表示赞赏,因为我只是不知道从什么开始。

4

1 回答 1

1

愿这对你有所帮助。


create procedure sp_MonthlyInsertHistory
as
begin
  merge History as target
  using (SELECT ClientID, CategCode from clients where statusid in (1,2)) as source (ClientID, CategCode)
  on (target.ClientID = source.ClientID and DATEDIFF(mm,target.RecordDate,GETDATE())=0)
  WHEN MATCHED THEN 
      UPDATE SET target.CategCode = Source.CategCode, 
                 target.RecordDate=GetDATE()
  WHEN NOT MATCHED THEN
      INSERT (ClientID,CategCode)
      VALUES (source.ClientID,source.CategCode);
END

于 2013-03-18T23:47:41.250 回答