如何编写一个简单的sql过程?

如何编写一个简单的sql过程?,sql,sql-server,sql-server-2008,stored-procedures,Sql,Sql Server,Sql Server 2008,Stored Procedures,我正在处理sql server数据库。我的数据库中有两个表与1到多个关联。第一个是父表,第二个是子表Parent表有一列ChildCount,每当添加或删除此父项的子项时,该列将更新 为此,我决定编写一个存储过程和一个DML触发器,它将在子表上执行插入和删除操作。我对数据库一无所知。我尝试过的是: 首先,我尝试创建一个过程(我将从触发器执行该过程) 在这里,我不明白如何提取一个完整的子项并将其保存在变量中,然后在update语句中使用该变量 请在指导我这个创建过程之后,建议我做什么这是正确的、好

我正在处理sql server数据库。我的数据库中有两个表与
1到多个
关联。第一个是父表,第二个是子表Parent表有一列ChildCount,每当添加或删除此父项的子项时,该列将更新

为此,我决定编写一个存储过程和一个DML触发器,它将在子表上执行插入和删除操作。我对数据库一无所知。我尝试过的是:

首先,我尝试创建一个过程(我将从触发器执行该过程)

在这里,我不明白如何提取一个完整的子项并将其保存在变量中,然后在update语句中使用该变量

请在指导我这个创建过程之后,建议我做什么这是正确的、好的和有效的方法,或者有其他更好的方法来做这件事

像这样试试看

 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
像这样试试

 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

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

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;

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

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;

也可以考虑使用计算列代替触发器。只需创建一个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)

是一个更详细的链接

> P>也可以考虑使用计算列代替触发器。只需创建一个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)

是一个更详细的链接

嘿,为什么不投票?我告诉过我,我是一个数据库新手,你打算从触发器以外的地方执行这段代码吗?如果没有,您也可以将代码放入触发器中。没有包含total child的列是
ChildCount
,我的意思是说单亲入口的所有child为什么需要存储计数?你可以在需要的地方在查询中计算。@MikaelEriksson是的,这是另一种方法,但不会让我的应用程序在每次需要total child时都慢下来查询?嘿,为什么要否决投票?我告诉过我,我是一个数据库新手,你打算从触发器以外的地方执行这段代码吗?如果没有,您也可以将代码放入触发器中。没有包含total child的列是
ChildCount
,我的意思是说单亲入口的所有child为什么需要存储计数?您可以在需要的地方在查询中计算。@MikaelEriksson是的,这是另一种方法,但不会减慢我的应用程序每次查询total child的速度。谢谢您的回答,您能告诉我我这样做的方法是否有效,或者我可以用其他更好的方法来做吗?更好的方法是在子表中为相应的父id写入触发器…用于插入和删除…当插入或删除不在子表中时,它会自动增加或减少父表中的子表计数儿童桌…谢谢你的回答,您能告诉我我这样做的方法是否有效,或者我可以用其他更好的方法来做吗?更好的方法是在子表中为相应的父id写入触发器…用于插入和删除…当插入或删除不在子表中时,它会自动增加或减少父表中的子表计数子表。。。。。