Курсор - это хорошая вещь. Вообще-то создание самого SQL было способом борьбы с курсорами. Но раз жизнь показывает в виде реализации в SQL Server, что без этого нельзя, то можно пользоваться. Итак, давайте посмотрим как можно объявить курсор.
DECLARE CURSOR_TYPE CURSOR FOR SELECT * FROM type
Объявляем курсор с именем CURSOR_TYPE для результата запроса SELECT * FROM type. Теперь можно курсор открыть.
OPEN CURSOR_TYPE
После использования закрыть:
CLOSE CURSOR_TYPE
Но закрытие не приведет к освобождению ресурсов. Курсор нужно удалить.
DEALLOCATE CURSOR_TYPE
Для получения записи нужно использовать FETCH. Для поверки, что записи есть @@FETCH_STATUS. Смотрим как можно пробежаться по всем записям.
DECLARE CURSOR_TYPE CURSOR FOR SELECT * FROM type OPEN CURSOR_TYPE FETCH NEXT FROM CURSOR_TYPE WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM Employee_Cursor END CLOSE CURSOR_TYPE DEALLOCATE CURSOR_TYPE
Давайте наши знания применим к шагу "Шаг 26 - Автоматическое получение сумм в другую таблицу" для того, чтобы пробежаться по таблице TYPE и посчитать соответствующие суммы.
CREATE TRIGGER NEW ON dbo.allcar FOR INSERT,UPDATE,DELETE AS DECLARE @cars numeric(18,2) DECLARE @types INT DECLARE @chars char(30) DECLARE CURSOR_TYPE CURSOR FOR SELECT * FROM type OPEN CURSOR_TYPE FETCH NEXT FROM CURSOR_TYPE INTO @types,@chars SELECT @cars = (SELECT SUM(prise) FROM allcar WHERE type=@types) UPDATE prisecar SET CountProse=@cars WHERE TYPE=@types WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM CURSOR_TYPE INTO @types,@chars SELECT @cars = (SELECT SUM(prise) FROM allcar WHERE type=@types) UPDATE prisecar SET CountProse=@cars WHERE TYPE=@types END CLOSE CURSOR_TYPE DEALLOCATE CURSOR_TYPE GO
Результат немного громоздкий по сравнению с прошлым шагом. Но зато мы спокойно можем добавить новые типы в таблицу type и новую запись в таблицу prisecar и будет автоматически иметь общие суммы стоимости не меняя логику. А она такая. Пробежаться по type и на основе ID_TYPE посчитать сумму техники в таблице allcar и эту сумму занести в поле в таблице prisecar. Если поступить, как в прошлом шаге, то мы должны были писать новый код для подсчета сумм.