2009-12-03 2 views
24

삽입 된 모든 행에 값이 업데이트되고 삽입 된 다른 열에 따라 다른 테이블에서 새 값을 가져와야하는 삽입 트리거를 만들려고합니다. 표.SQL 삽입 트리거를 사용하여 INSERTED 테이블 값 업데이트

내가 시도 :

UPDATE INSERTED 
SET TheColumnToBeUpdated = 
    (
    SELECT TheValueCol FROM AnotherTable.ValueCol 
    WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1 
    ) 
WHERE ValueCol IS NULL 

그러나 나는이 오류가 :

Msg 286, Level 16, State 1, Procedure ThisTable_INSERT, Line 15 
The logical tables INSERTED and DELETED cannot be updated. 

내가 어떻게해야합니까?

+0

, 여기 (사무실)에서 내 계정에 액세스 할 수 없습니다, 트리거보다 더 나은 대안이 될 것이다 기본 제약 조건을 사용하려면 다음을 수행하십시오. http://msdn.microsoft.com/en-us/library/aa175912%28SQL.80%29.aspx –

+0

기본값을 사용할 수 있지만 내 테이블을 업데이트 할 수 있습니다. 'DEFAULT 'S – Shimmy

+1

@OMG 조랑말에 적용 할 수없는 삽입 된 행의 다른 열에 따라 Shimmy는 질문에 따라 기본값을 사용할 수 없습니다 : http://stackoverflow.com/questions/1744455 – gbn

답변

39

논리 테이블이 아닌 대상 테이블을 업데이트해야합니다. 당신은 논리적 테이블과 결합하지만, 업데이트 할 행을 파악하기 :

UPDATE YourTable 
SET TheColumnToBeUpdated = 
    (
    SELECT TheValueCol FROM AnotherTable.ValueCol 
    WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1 
    ) 
FROM YourTable Y 
JOIN Inserted I ON Y.Key = I.Key 
WHERE I.ValueCol IS NULL 
19

가 대신 INSERT의에 트리거를 변경할 수 있습니다. 이렇게하면 들어오는 값을 확인하고 필요할 경우 다른 테이블의 값으로 바꿀 수 있습니다.

CREATE TRIGGER CoolTrigger 
ON MyAwesomeTable 
INSTEAD OF INSERT 
AS 
BEGIN 

INSERT MyAwesomeTable (TheValueCol) 
SELECT ISNULL(INSERTED.TheValueCol, AnotherTable.TheValueCol) AS TheValueCol 
FROM INSERTED 
JOIN AnotherTable ON INSERTED.ValueCol1 = AnotherTable.ValueCol1 

END 

참고 : INSTEAD OF 트리거는 재귀를 발생시키지 않습니다.

0
insert into output 
(SELECT t1.ts - INTERVAL (SECOND(t1.ts)%10) SECOND, 
t1.ts - INTERVAL (SECOND(t1.ts)%10) SECOND + INTERVAL 10 SECOND ,sum(t1.data), 
FROM (select * from input 
where unix_timestamp(ts) >= unix_timestamp('2000-01-01 00:00:10') 
and unix_timestamp(ts) < unix_timestamp('2000-01-01 00:01:20') 
) 
    as t1 
GROUP BY UNIX_TIMESTAMP(t1.ts) DIV 10); 

내 출력 테이블의 출처입니다. 그래서 삽입은 값에 의한 것이 아닙니다.

임 미안하지만 당신은 저장 프로 시저에서이 문제를 처리하는 로직을 캡슐화하지 않을 경우 내가

관련 문제