我正在使用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
这里我不明白如何提取一个完整的子节点并将其保存在变量中,而不是在update语句中使用该变量?
请在指导我完成这个CREATE PROCEDURE之后,建议我在做什么这是正确的,好的和有效的方法还是有其他更好的方法来做到这一点?
答案 0 :(得分: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
答案 1 :(得分: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;
答案 2 :(得分: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)
Here是一个包含更多详细信息的链接。