2015-10-30 1 views
2

ТаблицаSQL Server 2012 Вставьте DATEDIFF в триггером колонки всякий раз, когда новая запись вставляется

CREATE TABLE CurrentApplication 
(
    StartDate  datetime  NOT NULL, 
    EndDate   datetime  NOT NULL, 
    NoOfDays  integer, 
    StaffID   integer   NOT NULL, 
    AppStatus  varchar(30)  NOT NULL DEFAULT 'PENDING' 
) 

Trigger

CREATE TRIGGER InsertNoOfDays ON CurrentApplication 
AFTER INSERT 
AS 
BEGIN 
    DECLARE @temp INT 

    SELECT @temp = DATEDIFF(day, EndDate, StartDate) 
    FROM inserted 

    INSERT INTO CurrentApplication(NoOfDays) VALUES (@temp) 

    --SELECT StaffID = inserted.StaffID 
    --FROM inserted 

-- INSERT INTO CurrentApplication(NoOfDays) 
--  SELECT Datediff(day, EndDate, StartDate) 
--  FROM inserted; 
END 

Сообщение об ошибке:

Msg 515, Level 16, состояние 2, процедура InsertNoOfDays, строка 10
Невозможно вставить значение NULL в столбец «StartDate», таблица «StaffPortalDB.dbo.CurrentApplication»; столбец не допускает нулей. INSERT не работает. Заявление было прекращено.

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

+1

У вашего триггера есть ** ОСНОВНАЯ ** ошибка в том, что вы, кажется, считаете, что она будет называться ** один раз в строке ** - это ** не ** случай. Триггер будет срабатывать ** один раз за оператор **, поэтому, если ваши инструкции 'INSERT' влияют на 25 строк, вы получите триггер, запущенный ** один раз **, но затем' Inserted' будет содержать 25 строк. Какой из этих 25 строк будет выбран ваш код? 'SELECT @temp = DATEDIFF (день, EndDate, StartDate) FROM вставлен' - он не детерминирован, он будет выбирать из одной произвольной строки и ** игнорировать ** все 24 других. Для этого нужно переписать триггер! –

ответ

1

IF Sql server Попробуйте вставить некоторые значения по умолчанию или фиктивными, так как его not null колонке

Некоторые вещи, как это:

CREATE TRIGGER InsertNoOfDays ON CurrentApplication 
AFTER INSERT 
AS 
BEGIN 
    DECLARE @temp INT 

    SELECT @temp = coalesce(DATEDIFF(day, EndDate, StartDate),0) --Default 0 
    FROM inserted 

    INSERT INTO CurrentApplication(NoOfDays) VALUES (@temp) 

    --SELECT StaffID = inserted.StaffID 
    --FROM inserted 

-- INSERT INTO CurrentApplication(NoOfDays) 
--  SELECT Datediff(day, EndDate, StartDate) 
--  FROM inserted; 
END 
+0

Привет! Я пробовал это, но я все равно получаю ту же ошибку. D: –

+0

Вы отметили комментарий @ @ marc_s? попробуйте использовать «cross apply» в этом случае. –

0

Это потому, что ваш Вставить оператор пытается вставить запись, но не вставляя любые значения в столбцы, которые не могут быть пустыми (StartDate, EndDate, StaffID, AppStatus). Чтобы эта вставка была успешной, вам нужно либо изменить оператор INSERT, чтобы вставить значение в эти столбцы, либо изменить схему таблицы, чтобы разрешить значения NULL.