如何在表中插入行并在SQL Server中插入新行之前更新最后一行

时间:2013-10-09 20:35:30

标签: sql sql-server stored-procedures insert-update

这是我的表CustInfo的结构

 Cm_ID | Cust_ID  | StartDate   |   EndDate        | Status 
   1   |   1020   |  05/09/2013 |   20/09/2013     |    Off
   2   |   1027   |  16/09/2013 |   **31/12/2099** |    **On**
   3   |   1020   |  21/09/2013 |   31/12/2099     |    On

每当我为Cust_ID = 1027插入一个新行时,我想这样做。它应该首先将[EndDate]更新为新的[StartDate],即Today和Set [Status] ='Off'。

插入新行后,它应该如下所示

 Cm_ID | Cust_ID  | StartDate   |   EndDate        | Status 
   1   |   1020   |  05/09/2013 |   20/09/2013     |    Off
   2   |   1027   |  16/09/2013 |   **30/09/2013** |    **Off**
   3   |   1020   |  21/09/2013 |   31/12/2099     |    On
   4   |   1027   |  01/10/2013 |   31/12/2099     |    On

我使用2个不同的查询完成了此操作,如下所示。

Update CustInfo SET EndDate = '30/09/2013' ,Status='Off'
WHERE Cm_ID=(SELECT MAX(Cm_ID) FROM CustInfo WHERE EndDate='12/31/2099' AND Cust_ID=1027)

INSERT INTO CustInfo ([Cust_ID], [StartDate], [EndDate], [CurrentStatus])
VALUES(1027,'01/10/2013','12/31/2099','On') 

现在我想使用单个查询或存储过程来执行此操作。但我不知道该怎么做?

1 个答案:

答案 0 :(得分:1)

您可能最好使用触发器,这样逻辑就会应用于所有INSERT,而不是依赖于使用SP的人。另外,最好在UPDATE之后执行INSERT,即仅在INSERT成功时执行。{/ p>

CREATE TRIGGER trgCustInfo_Status
ON CustInfo
AFTER INSERT
AS
BEGIN
  DECLARE @id INT

  SELECT @id = Id 
  FROM (
    SELECT Id, ROW_NUMBER() OVER (ORDER BY Id DESC) rn 
    FROM CustInfo
  ) t
  WHERE rn=2

  UPDATE CustInfo
  SET EndDate = CAST(GETDATE() AS DATE),
      Status = 'OFF'
  WHERE Id = @id
END