Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помощь в триггере  [new]
Pabl0
Member

Откуда:
Сообщений: 265
Подскажите,


	INSERT INTO History (TextID, DateEdit, [ValueOld], [ValueNew])
	SELECT i.TextID, GETDATE(), d.[Value], i.[Value]
	FROM
        INSERTED i
            full outer join DELETED d on i.TextID = d.TextID AND d.[Value] != i.[Value]


Проблема в том что если изменять запись и Value не меняется, то изменение выдает null у TextID (а такого быть не может, следовательно ошибка sql)

Можно без if как то решить этот вопрос что бы если value разное то срабатывает триггер, если одинаковое, то триггер не срабатывает
13 дек 18, 17:24    [21763272]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в триггере  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4683
Pabl0
Подскажите,


	INSERT INTO History (TextID, DateEdit, [ValueOld], [ValueNew])
	SELECT i.TextID, GETDATE(), d.[Value], i.[Value]
	FROM
        INSERTED i
            full outer join DELETED d on i.TextID = d.TextID AND d.[Value] != i.[Value]


Проблема в том что если изменять запись и Value не меняется, то изменение выдает null у TextID (а такого быть не может, следовательно ошибка sql)

Можно без if как то решить этот вопрос что бы если value разное то срабатывает триггер, если одинаковое, то триггер не срабатывает


	INSERT INTO History (TextID, DateEdit, [ValueOld], [ValueNew])
	SELECT ISNULL(i.TextID,d.TextID), GETDATE(), d.[Value], i.[Value]
	FROM
        INSERTED i
            full outer join DELETED d on i.TextID = d.TextID AND d.[Value] != i.[Value]
13 дек 18, 17:30    [21763282]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в триггере  [new]
Pabl0
Member

Откуда:
Сообщений: 265
a_voronin, в принципе совет годный, но триггер будет выполняться и отработает и запишет запись в таблицу, а это он делать не должен если [Value] не изменилось
13 дек 18, 17:36    [21763287]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в триггере  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4683
Pabl0
a_voronin, в принципе совет годный, но триггер будет выполняться и отработает и запишет запись в таблицу, а это он делать не должен если [Value] не изменилось


WHERE ISNULL(d.[Value], '') != ISNULL(i.[Value], '')


или

WHERE d.[Value] != i.[Value] OR (d.[Value] IS NULL AND  i.[Value] IS NOT NULL) OR (d.[Value] IS NOT NULL AND  i.[Value] IS NULL)
13 дек 18, 17:45    [21763296]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в триггере  [new]
invm
Member

Откуда: Москва
Сообщений: 9279
INSERT INTO History (TextID, DateEdit, [ValueOld], [ValueNew])
	SELECT ISNULL(i.TextID,d.TextID), GETDATE(), d.[Value], i.[Value]
	FROM
        INSERTED i
            full outer join DELETED d on i.TextID = d.TextID
        where
          not exists(select d.[Value] intersect select i.[Value])
13 дек 18, 17:55    [21763313]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в триггере  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4683
invm,

знаете толк в извращениях написании подзапросов

not exists(select d.[Value] intersect select i.[Value])
13 дек 18, 17:58    [21763321]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в триггере  [new]
Pabl0
Member

Откуда:
Сообщений: 265
a_voronin, вот так сделал работает
WHERE ISNULL(d.[Value], '') != ISNULL(i.[Value], '')
, но я не понимаю, это же мы проверяем если не null то пусто вставляем, как это помогло решить проблему, можете пояснить?
13 дек 18, 17:58    [21763322]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в триггере  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4683
Pabl0
a_voronin, вот так сделал работает
WHERE ISNULL(d.[Value], '') != ISNULL(i.[Value], '')
, но я не понимаю, это же мы проверяем если не null то пусто вставляем, как это помогло решить проблему, можете пояснить?


Откройте для себя высшую истину

SELECT 1
WHERE NULL = NULL

SELECT 1
WHERE ISNULL(NULL,'') = ISNULL(NULL,'')

SELECT 1
WHERE NULL != NULL

SELECT 1
WHERE NOT ISNULL(NULL,'') != ISNULL(NULL,'')
13 дек 18, 18:01    [21763328]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить