Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中插入新行之前,如何在表中插入行并更新最后一行_Sql_Sql Server_Stored Procedures_Insert Update - Fatal编程技术网

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

在SQL Server中插入新行之前,如何在表中插入行并更新最后一行,sql,sql-server,stored-procedures,insert-update,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

这是我的表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],即今天,并设置[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
我使用以下两种不同的查询完成了这项工作

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') 

现在,我想使用单个查询或存储过程来实现这一点。但是我不知道怎么做?

您可能最好使用触发器,这样逻辑将应用于所有
INSERT
s,而不是依赖于使用SP的人。此外,最好在
INSERT
之后执行
更新
,也就是说,只有当
INSERT
成功时

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

您可能最好使用触发器,这样逻辑将应用于所有
INSERT
s,而不是依赖于使用SP的人员。此外,最好在
INSERT
之后执行
UPDATE
,即仅当
INSERT
成功时

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