2013-04-29 2 views
0

Я работаю над базами данных sql server. У меня есть 2 таблицы с ассоциацией 1 to many в моем db. Первый - Родитель стол и второй Ребенок стол. Родитель Таблица имеет столбец 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 

Вот я не понимаю, как извлечь общий ребенок и сохранить он в переменной и чем использовать эту переменную в операторе обновления ???

И, пожалуйста, после моего руководства по этой ПРОЦЕДУРЕ СОЗДАНИЯ, предложите мне, что я делаю, это правильный, хороший и эффективный подход или есть другой лучший подход для этого?

+1

эй, почему голос? Я сказал, что я совершенно новый в базе данных – user1740381

+0

Собираетесь ли вы выполнить этот код откуда-то, кроме триггера? Если нет, вы можете просто ввести код в триггер. – DeanOC

+0

Нет столбца 'ChildCount' с полным дочерним элементом i означает говорить все дочерние элементы для одной родительской записи – user1740381

ответ

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

+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

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 ссылка с дополнительной информацией.

Смежные вопросы