0

我正在研究 sql server 数据库。我的数据库中有 2 个1 to many关联表。第一个是表,第二个是表。表有一个ChildCount列,只要添加或删除此父项的子条目,该列就会更新。

所以为此我决定编写一个存储过程和一个 DML 触发器,它将在Child表上的 INSERT 和 DELETE 操作上执行。我是数据库的新手。我尝试过的是:

首先我试图创建一个程序(我将从触发器执行)

CREATE PROCEDURE [dbo].[ChildCount]
    @parentId int
AS
    //here first i have to extract the total child for the given parentId and 
    //than in the next update statement i will update the count.

    UPDATE Parent
    SET ChildCount = //above total child value
    WHERE Id = parentId
RETURN 0

在这里,我不明白如何提取一个总的孩子并将其保存在一个变量中,而不是在更新语句中使用该变量?

请在指导我完成这个创建过程之后,建议我做的事情是正确的、好的和有效的方法,或者还有其他更好的方法吗?

4

3 回答 3

3

像这样试试

 CREATE PROCEDURE [dbo].[ChildCount]
        @parentId int
    AS

    Begin
    Declare @i as int;

    Select @i=count(child) from childtable where parentid=@parentId 

        UPDATE Parent
        SET ChildCount =@i
        WHERE Id = @parentId
    End
于 2013-04-29T03:42:45.000 回答
0

您还可以考虑使用计算列而不是触发器。只需创建一个 UDF,它将返回给定父级的子级数,并从中创建一个计算列。

这是它的样子

CREATE FUNCTION dbo.GetChildCount(@ParentID int)
RETURNS int
BEGIN
    RETURN (SELECT COUNT(*) FROM Child WHERE ParentID = @ParentID)
END


ALTER TABLE Parent
    ChildCount as dbo.GetChildCount(ParentID)

是包含更多详细信息的链接。

于 2013-04-29T08:39:48.447 回答
0

如果您想使用触发器执行此操作,则可能是这样的:

create trigger dbo.tr_Child on dbo.Child for insert, update, delete
as

update dbo.Parent
set ChildCount = (select count(*) from dbo.Child where Child.ParentID = T.ParentID)
from 
  (
  select ParentID from inserted union 
  select ParentID from deleted
  ) as T
where Parent.ParentID = T.ParentID;

SQL小提琴

于 2013-04-29T05:37:27.073 回答