2013-08-12 3 views
0

ОК, название - глоток.Обновление значений таблиц в триггере в зависимости от подмножества данных

В основном это означает, что при работе со строками из вставленной таблицы, в зависимости от значения в определенном столбце, который разбивает строки на одно из двух подмножеств, данные обрабатываются одним из двух способов. Теперь это можно было повторить с помощью курсора, вероятно, CTE тоже, но есть ли другой способ, следующий (псевдо) код выглядит UGLY и на самом деле не работает, но он дает вам представление о том, что я ищу:

Trigger

ALTER trigger [dbo].[tcdA_Combined_ActiveUnitShiftExpiredStatus_UpdateShift] on [dbo].[cd_units] after update as 
begin 

SET NOCOUNT ON 

IF UPDATE(shift_start) 
BEGIN 

    IF(inserted.ag_id <> 'FIRE') 
     BEGIN 
      update cd_units set shift_expired_status = 0 
      from inserted 
      where inserted.unid = cd_units.unid and inserted.shift_start <= dbo.get_dts() 
     END 
    ELSE 
     BEGIN 
      update cd_units set shift_expired_status = 0 
      from inserted 
      where inserted.unid = cd_units.unid and inserted.shift_start >= dbo.get_dts() 
     END 

     update cd_units set sask911_shift_end = (select substring(shift_start,5,2)+'/'+substring(shift_start,7,2) 
     +' '+substring(shift_start,9,2)+':'+substring(shift_start,11,2) from inserted) 
     from cd_units join inserted on cd_units.unid=inserted.unid; 
    END 
END 

как всегда, заранее спасибо за помощь

+0

Какова цель использования IF (inserted.ag_id <> 'FIRE')? В обоих условиях вы обновляете shift_expired_status до 0. – AgentSQL

ответ

2

Я думаю, что главная проблема здесь состоит в том, что вы лечите inserted в одной строке, в то время как все триггеры в SQL Server являются триггеры уровня таблицы. Таким образом, inserted является таблицей, и вы не можете сравнить столбец с одним значением. Я бы сделал это с чем-то вроде следующего.

Эта часть предназначена для обеих ветвей: только

update cd_units set shift_expired_status = 0 
from inserted 
where inserted.unid = cd_units.unid 
    and inserted.shift_start <= dbo.get_dts(); 

Эта часть обновления, когда inserted.ag_id = 'FIRE':

update cd_units 
set sask911_shift_end = substring(inserted.shift_start,5,2) + '/' + 
         substring(inserted.shift_start,7,2) + ' ' + 
         substring(inserted.shift_start,9,2) + ':' + 
         substring(inserted.shift_start,11,2) 
from cd_units join inserted on cd_units.unid=inserted.unid 
where inserted.ag_id = 'FIRE'; 
+0

Спасибо, Джон, но если бы я был «выборочно» -пункт не предназначен, чтобы обновить те записи, которые не имеют ag_id «FIRE», но обновляют остальные, как бы Я об этом? КТР? – SteveMustafa

+0

@SteveMustafa Можете ли вы перефразировать это? Вы сказали обновление в обоих случаях. –

+0

[@John Tseng] Ой, извините. Я хотел сказать, что обновление ТОЛЬКО этих записей из вставленных, которые имеют ag_id = 'FIRE'. В настоящее время работает над параметром Temp Table/Table Var, но я ценю всю помощь. – SteveMustafa

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