2014-10-02 23 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表,使用DOCID從該表中的對象(PVDM_OBJS_1234_13)表匹配相同DOCID檢索的網頁值,然後插入到DOCINDEX13(我們正在存儲用戶可見頁數的字段),其中DOCINDEX13爲空。

如果將一批5行或500行插入到PVDM_DOCS_1234_13中,則插入的最後一個永遠不會插入頁計數,它仍然爲NULL。其餘的都會插入頁碼。無法弄清楚爲什麼最後一行總是被拋在後面。

注意我是一個SQL新手,這是由不再可用的人編寫的。

任何想法,爲什麼這將適用於除最後一個插入的所有新行?

謝謝!

回答

2

一種可能性是 DOCINDEX13 is not正在更新的行上爲NULL。如果沒有樣本數據,就必須查明發生了什麼問題。

順便說一句,我傾向於寫這個查詢爲:

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; 

如SQL一般規則,在from子句中不要使用逗號。始終使用明確的join語法。