2009-07-24 5 views
29

Ok, так что моя схема такова:SQL Server ЕСЛИ НЕ СУЩЕСТВУЕТ Использование?

Таблица: Timesheet_Hours

Колонки:

  • Timesheet_Id (PK, INT)
  • Staff_Id (интермедиат)
  • BookedHours (интермедиат)
  • Отправленный_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 
+0

Это 1 название столбца в таблице Timesheet_Hours? – SirDemon

+1

Нет, это не так. Поскольку я использую EXISTS, я просто следил за тем, что я считал стандартной практикой в ​​подзапросах с использованием EXISTS. –

+2

1 в этом случае является константой. Все, о чем он заботится, это то, что возвращается строка, а не значение любых столбцов. Использование константы обычно быстрее, чем использование * или определенного списка столбцов. – Rick

ответ

32

Вы подтвердили, что на самом деле существует строка, где Staff_Id = @PersonID? То, что вы опубликовали, отлично работает в тестовом скрипте, предполагая, что строка существует. Если вы закомментируете инструкцию 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 
+0

Спасибо, помощник. Оказалось, что я не передавал правильный личный идентификатор из триггера INSERT. Меня это сбивало с толку, потому что он работал с триггерами UPDATE и DELETE, но я не думал проверять параметры. –

Смежные вопросы