如何编写简单的sql程序?

时间:2013-04-29 03:36:42

标签: sql sql-server sql-server-2008 stored-procedures

我正在使用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之后,建议我在做什么这是正确的,好的和有效的方法还是有其他更好的方法来做到这一点?

3 个答案:

答案 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;

SQL Fiddle

答案 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是一个包含更多详细信息的链接。