在SQL Server中插入新行之前,如何在表中插入行并更新最后一行
这是我的表CustInfo的结构在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
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