Хрнимая процедура - как вызвать для все элементов?
От: maslukov  
Дата: 09.04.07 13:51
Оценка:
Здравствуйте!

Есть следующая проблема.

База данных содержит таблицу (Table) вида

ID (ключ), Размер (int), ParentID( ссылка на родителя).

Есть хранимая процедура которая считат сумму Размеров

ALTER PROCEDURE dbo.GetTotalSize 
    (
    @parameter1 int
    )    
AS

/* SET NOCOUNT ON */ 
DECLARE @ret int;
SET @ret = (SELECT SUM(Size) FROM Table WHERE ParentID = @parameter1);

RETURN @ret


Как применить данную процедуру ко всем элементам относщимся к некоторому набору?
Т.е. как реализовать процедуру Update которая вызовет процедуру GetTotalSize для всех элементо удовлетвгоряющих уловию.
т.е.

ALTER PROCEDURE dbo.UpdateProject
    (
    @ProjectID int
    )
AS

UPDATE Table
SET SizeSLOC = /* ЗДЕСЬ ХОЧЕТСЯ ВЫЗВАТЬ хранимую процедуру GetTotalSize и передать туда ID элемента) что то типа EXEC GetTotalSize ID
WHERE ParentID = @ProjectID

/* SET NOCOUNT ON */ 
RETURN


Есс-но UpdateProject не работает — не могу понять как написать правильно.
Заранее спасибо.
Re: Хрнимая процедура - как вызвать для все элементов?
От: yrtimiD Израиль  
Дата: 09.04.07 14:00
Оценка:
Здравствуйте, maslukov, Вы писали:

M>Как применить данную процедуру ко всем элементам относщимся к некоторому набору?

M>Т.е. как реализовать процедуру Update которая вызовет процедуру GetTotalSize для всех элементо удовлетвгоряющих уловию.

Не уверен что поможет, но в MS SQL2005 имеется милая опция CROSS APPLY, возможно она сможет тебе помочь.
Re: Хрнимая процедура - как вызвать для все элементов?
От: yrtimiD Израиль  
Дата: 09.04.07 15:58
Оценка:
Да и Курсоры тоже пока ни кто не отменял...
Re: Хрнимая процедура - как вызвать для все элементов?
От: Андрийко Украина  
Дата: 09.04.07 18:11
Оценка: +1
Здравствуйте, maslukov, Вы писали:


M>UPDATE Table

M>SET SizeSLOC = /* ЗДЕСЬ ХОЧЕТСЯ ВЫЗВАТЬ хранимую процедуру GetTotalSize и передать туда ID элемента) что то типа EXEC GetTotalSize ID
M>WHERE ParentID = @ProjectID

M>/* SET NOCOUNT ON */

M>RETURN
M>[/sql]

M>Есс-но UpdateProject не работает — не могу понять как написать правильно.

к великому сожалению, нельзя так в T-SQL


Думаю нужно изменит сам подход, т.е, рекомендую в место процедуры написать скалярную функцию dbo.GetTotalSize(...) которая будет делать тоже самое и возвращать нужный вам результат, при условии, конечно, что речь идет о MS SQL Server 2000 и выше.

тогда код
UPDATE Table
SET SizeSLOC = dbo.GetTotalSize(ID)
WHERE ParentID = @ProjectID

будет валидным

ИМХО: приведенный код процедуры GetTotalSize претендует больше на функцию по своему определению и содержанию
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.