Подтвердить что ты не робот

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
4b9b3361

Ответ 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