2013-04-29 135 views
0

我正在使用sql server數據庫。我有我的分貝與1 to many協會的2個表。首先是父母表和第二個是表。 表有一列ChildCount無論何時添加或刪除此父項的子項,它都將進行更新。如何編寫簡單的sql程序?

因此,爲此我決定編寫一個存儲過程和一個DML觸發器,它將對子表上的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 

在這裏,我不知道如何提取總孩子和保存它在一個變量中,而不是在更新語句中使用該變量?

請指導我在這個CREATE PROCEDURE後,建議我在做什麼這是正確的,好的和有效的方法或有其他更好的方法來做到這一點?

+1

嘿,爲什麼要投票?我告訴我,我是全新的數據庫 – user1740381 2013-04-29 03:38:59

+0

你打算從觸發器以外的地方執行這段代碼嗎?如果沒有,你可能只需將代碼放入觸發器即可。 – DeanOC 2013-04-29 03:43:04

+0

沒有列是「ChildCount」,總共有孩子我的意思是說單個父項目的所有孩子 – user1740381 2013-04-29 03:46:40

回答

3

嘗試這樣

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

    Begin 
    Declare @i as int; 

    Select @i=count(child) from childtable where [email protected] 

     UPDATE Parent 
     SET ChildCount [email protected] 
     WHERE Id = @parentId 
    End 
+0

謝謝你的回答,你能告訴我是我的做法是有效的,或者我可以用其他更好的方法做到這一點? – user1740381 2013-04-29 03:49:19

+1

更好的方法來編寫觸發器...用於在子表中插入和刪除相應的父ID ...它將自動遞增或遞減在父表中插入或刪除不在子表中時的子表的計數... .. – 2013-04-29 03:51:27

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

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是更多詳細信息的鏈接。