SQL Server ЕСЛИ НЕ СУЩЕСТВУЕТ Использование?
Итак, моя схема такова:
Таблица: Timesheet_Hours
Столбцы:
- Timesheet_Id (PK, int)
- Staff_Id (int)
- BookedHours (int)
- Добавлено_Flag (boolean)
Это чрезвычайно упрощенная версия таблицы, но она будет служить для целей этого объяснения. Предположим, что у человека может быть только одна запись в расписании.
То, что я пытаюсь сделать, это добавить записи в другую таблицу, называемую WorkLog. У каждой записи есть время, связанное с ней. Когда эта таблица обновляется, я хочу также обновить Timesheet_Hours.
Прежде чем обновлять Timesheet_Hours, я хочу сначала проверить, что соответствующие расписания еще не были опубликованы, а затем я хочу проверить, действительно ли на самом деле есть запись для обновления.
Первая часть инструкции if, которая проверяет, что расписания еще не отправлены, работает нормально. Проблема заключается в второй части. Это checkint, чтобы увидеть, что запись, которую он собирается обновить, уже существует. Проблема в том, что он всегда вызывает ошибку.
NB: приведенный ниже код извлекается из хранимой процедуры, запускаемой триггерами обновления, вставки и удаления в таблице WorkLog. @PersonID является одним из параметров этой таблицы. Хранимая процедура работает нормально, если я прокомментирую вторую часть этого утверждения.
IF EXISTS
(
SELECT 1
FROM Timesheet_Hours
WHERE Posted_Flag = 1
AND Staff_Id = @PersonID
)
BEGIN
RAISERROR('Timesheets have already been posted!', 16, 1)
ROLLBACK TRAN
END
ELSE
IF NOT EXISTS
(
SELECT 1
FROM Timesheet_Hours
WHERE Staff_Id = @PersonID
)
BEGIN
RAISERROR('Default list has not been loaded!', 16, 1)
ROLLBACK TRAN
END
Ответы
Ответ 1
Вы проверили, что на самом деле есть строка, где Staff_Id = @PersonID? То, что вы опубликовали, отлично работает в тесте script, предполагая, что строка существует. Если вы закомментируете инструкцию insert, тогда возникает ошибка.
set nocount on
create table Timesheet_Hours (Staff_Id int, BookedHours int, Posted_Flag bit)
insert into Timesheet_Hours (Staff_Id, BookedHours, Posted_Flag) values (1, 5.5, 0)
declare @PersonID int
set @PersonID = 1
IF EXISTS
(
SELECT 1
FROM Timesheet_Hours
WHERE Posted_Flag = 1
AND Staff_Id = @PersonID
)
BEGIN
RAISERROR('Timesheets have already been posted!', 16, 1)
ROLLBACK TRAN
END
ELSE
IF NOT EXISTS
(
SELECT 1
FROM Timesheet_Hours
WHERE Staff_Id = @PersonID
)
BEGIN
RAISERROR('Default list has not been loaded!', 16, 1)
ROLLBACK TRAN
END
ELSE
print 'No problems here'
drop table Timesheet_Hours