0

私は自分の履歴テーブルをチェックしてその中のレコードを書き換えるライトプロシージャに縛られています。今月挿入された記録を、新しい挿入で複製された場合にのみ置き換える必要があります。

今のところ、ステータス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必要があります。現在、clientid12がstatusid1または2にないが、すでにテーブルにある場合は、そこにとどまる必要があります。ただし、レコードが今月に作成されていない場合、または挿入ステートメントのselectに含まれていない場合は、レコードを削除しないでください。(たとえば、新しいクライアント)。私の説明をご理解いただければ幸いです。何から始めればいいのかわからないので、助けていただければ幸いです。

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 に答える