SQL触发器保持最后匹配的行不变

时间:2014-10-02 23:11:39

标签: sql sql-server triggers

这是一个触发器,用于在将文档的元数据行添加到表格时添加页面数。

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以检索PAGES值,然后将其插入DOCINDEX13(我们存储用户可见页面数的字段,其中DOCINDEX13为空。

如果将一批5或500行插入到PVDM_DOCS_1234_13中,则插入的最后一行永远不会插入页数,它将保持为NULL。所有其余的都插入了页数。无法弄清楚为什么最后一行总是落在后面。

注意我是一个SQL新手,这是由不再可用的人编码的。

为什么这会对除了插入的最后一行以外的所有新行有效?

谢谢!

1 个答案:

答案 0 :(得分: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中的一般规则,请勿在{{1​​}}子句中使用逗号。始终使用明确的from语法。