2014-10-02 2 views
0

문서의 메타 데이터 행을 테이블에 추가 할 때 페이지 수를 추가하는 데 사용되는 트리거입니다.SQL 트리거가 마지막으로 일치하는 행을 그대로 둡니다.

USE [DD1234] 
GO 
/****** Object: Trigger [dbo].[AfterIns_Pages_ABC_LandCont] Script Date: 10/02/2014 16:30:33  ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[AfterIns_Pages_ABC_LandCont] 
    ON [dbo].[PVDM_DOCS_1234_13] 
    AFTER INSERT 
AS 
BEGIN 

    SET NOCOUNT ON; 

UPDATE D 
SET D.DOCINDEX13 = O.Tot_Pages 
FROM dbo.PVDM_DOCS_1234_13 D, 
(SELECT DOCID, Sum(PAGES) AS Tot_Pages FROM dbo.PVDM_OBJS_1234_13 
GROUP BY DOCID) O 
WHERE D.DOCID = O.DOCID 
AND D.DOCINDEX13 IS NULL 
END 
GO 

행이 (또는 많은)에 PVDM_DOCS_1234_13 테이블에 추가 그러니까 기본적으로 후, 페이지 값을 검색 (PVDM_OBJS_1234_13) 테이블 개체에 같은 DOCID에 맞게 해당 테이블에서 DOCID을 사용하고 삽입 DOCINDEX13 (사용자가 볼 수있는 페이지 수를 저장하는 필드)에 DOCINDEX13이 null 인 경우.

5 또는 500 행의 배치를 PVDM_DOCS_1234_13에 삽입하면 마지막으로 삽입 된 페이지 수가 삽입되지 않고 NULL로 유지됩니다. 나머지는 삽입 된 페이지 수를 얻습니다. 왜 마지막 행이 항상 뒤쳐져 있는지 알 수 없습니다.

참고 저는 SQL 초보자입니다. 더 이상 제공되지 않는 사람이 작성했습니다.

삽입 된 마지막 행을 제외한 모든 새 행에 대해 이것이 작동하는 이유는 무엇입니까?

감사합니다.

답변

2

하나의 가능성은 갱신되는 행에 대해 DOCINDEX13 is not NULL입니다. 샘플 데이터가 없으면 무엇이 잘못되었는지 파악해야합니다. from 절에 쉼표를 사용하지 않는, SQL의 일반적인 규칙으로

with toupdate as (
     select d.*, sum(pages) over (order by docid) as tot_pages 
     from dbo.PVDM_DOCS_1234_13 
    ) 
update toupdate 
    set docindex13 = tot_pages 
    where docindex13 is null; 

: 그런데

는, I는이 쿼리를 작성하는 경향 될 것입니다. 항상 명시적인 join 구문을 사용하십시오.

관련 문제