@Ramazeca

Как создать триггер, который бы высчитывал разницу между датами в днях и записывал бы это число в поле?

Добрый день всем кто меня читает. Сразу скажу, я новичок в этом деле.

Необходимо создать триггер, который бы высчитывал разницу между датами в днях и записывал бы это число в поле. Собственно написал тестовый триггер:
create trigger trigger_set_days on guests
for insert, update
as
declare @Date1 datetime
declare @Date2 datetime
declare @TotalDays int
declare @PassportNumber varchar(50)
begin
set @Date1 = (select CheckInDate from inserted)
set @Date2 = (select CheckOutDate from inserted)
set @PassportNumber = (select PassportNumber from inserted)
if ((GETDATE()) < (@Date1))
	begin
		set @TotalDays = (select datediff(dd, @Date1, @Date2))
		update guests set TotalDays = @TotalDays where CheckInDate=@Date1 and CheckOutDate=@PassportNumber
	end
else
	begin
		set @TotalDays = (select datediff(dd, GETDATE(), @Date2))
		update guests set TotalDays = @TotalDays where CheckInDate=@Date1 and  PassportNumber=@PassportNumber
	end
end

Он работает на insert, но когда я вызываю хранимую процедуру, в ней происходит update, она вылетает с ошибкой:

Msg 512, Level 16, State 1, Procedure trigger_set_days, Line 9
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.


Без триггера процедура на update работает без ошибок. Что в ошибке написано я понимаю. Поясните в чем проблема, почему с триггером у меня выводятся множество непонятных значений. Можно ли просмотреть таблицу inserted?
  • Вопрос задан
  • 2693 просмотра
Пригласить эксперта
Ответы на вопрос 1
IlyasMasirov
@IlyasMasirov
Подзапрос вернул больше одного значения в
set @Date1 = (select CheckInDate from inserted)
Заставьте подзапрос вернуть только одно значение с помощью WHERE и LIMIT 1.

Также исправьте код в местах:
set @Date2 = (select CheckOutDate from inserted)

set @PassportNumber = (select PassportNumber from inserted)

 set @TotalDays = (select datediff(dd, GETDATE(), @Date2))

set @TotalDays = (select datediff(dd, @Date1, @Date2))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы