2013-10-09 76 views
1

這裏是CustInfo如何插入一行到一個表,並在SQL Server中插入新行前更新的最後一排

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

你可能更適合使用觸發器,這種邏輯適用於所有INSERT,而不是依靠使用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 
相關問題