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与Object(PVDM_OBJS_1234_13)表中的相同DOCID匹配以检索PAGES值,然后将其插入DOCINDEX13(我们存储用户可见页面计数的字段)中,其中DOCINDEX14为空。

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

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

有什么想法吗?为什么这适用于除插入的最后一行之外的所有新行?

谢谢!

一种可能性是正在更新的行上的DOCINDEX13 from为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中的一般规则,不要在join子句中使用逗号。始终使用明确的CCD_4语法。

相关内容

最新更新