2013-10-09 2 views
1

내가하고 싶은어떻게 여기

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 

CustInfo 내 테이블의 구조는 테이블에 행을 삽입하고 SQL 서버에 새 행을 삽입하기 전에 마지막 행을 업데이트하는 것을 나는 새로운 행을 삽입 할 때마다 for Cust_ID = 1027 먼저 [EndDate]를 새로운 [StartDate] 즉 Today로 업데이트하고 [Status] = 'Off'로 설정해야합니다.

새 행을 삽입 한 후에는 다음과 같이 나는이 사용하는 2 개 개의 다른 쿼리를 수행 한이

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

이제 단일 쿼리 또는 저장 프로 시저를 사용하여이 작업을 수행하려고합니다. 그러나 나는 이것을 어떻게하는지 모른다.

답변

1

아마도 트리거를 사용하는 것이 더 좋을 것입니다. 논리를 SP를 사용하는 사람들에게 의존하지 말고 모든 INSERT에 적용합니다. 또한 INSERT이 성공한 경우에만 INSERT 다음에 UPDATE을 실행하는 것이 좋습니다.

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