Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Сиволапый Member Откуда: Сообщений: 15 |
Доброго времени суток. Есть база MS SQL 2008. Необходимо менять значение одного поля в таблице в зависимости от его значения. Написал запрос update: update dbo.pLogData set timeval = DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval) where (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '08:30:00' and '08:59:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') Сделал абсолютно простейший триггер for insert: create trigger trpTimeLogData_Inserted_Updated on dbo.plogdata for insert as begin update dbo.pLogData set timeval = DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval) where (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '08:30:00' and '08:59:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') end И запрос и триггер работают, всё хорошо. Вот только хотелось бы чтоб данные менялись ещё до вставки в таблицу. Если я правильно понимаю то мне нужен триггер Instead OF, но как мне его реализовать в коде не знаю, а сделать нужно до конца недели. Помогите? |
28 мар 17, 09:36 [20339619] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
Сиволапый, а в чем у Вас затруднение? в instead of insert triggere делаете insert в базовую таблицу значений из inserted модифицируя Ваше поле timeval в CASE по критерию, указанному в where в триггере trpTimeLogData_Inserted_Updated |
28 мар 17, 10:02 [20339764] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31780 |
Нехороший код, хотя визуально ошибки вы можете какое то время не заметить.
|
||||
28 мар 17, 10:09 [20339818] Ответить | Цитировать Сообщить модератору |
Сиволапый Member Откуда: Сообщений: 15 |
Да вот в синтаксисе у меня проблема :) |
28 мар 17, 12:10 [20340746] Ответить | Цитировать Сообщить модератору |
Сиволапый Member Откуда: Сообщений: 15 |
USE [ORION120TEST] GO /****** Object: Trigger [dbo].[insteadof] Script Date: 03/28/2017 14:28:50 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER trigger [dbo].[insteadof] on [dbo].[pLogData] instead of insert as begin select timeval HozOrgan from inserted where (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '08:30:00' and '08:59:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') /* set timeval = DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval) insert timeval into dbo.plogdata */ end На данный момент я вот на этом остановился, по идее, дальше нужно модифицировать значение и вставить его в dbo.plogdata... Вот не могу правильно это написать... |
28 мар 17, 12:49 [20340948] Ответить | Цитировать Сообщить модератору |
Сиволапый Member Откуда: Сообщений: 15 |
Остановился, в том смысле что данный код в Management Studio хотя бы ошибок не выдает :) P.S. Извиняюсь что каждый раз создаю новое сообщение, не могу найти кнопку редактировать... |
28 мар 17, 12:51 [20340962] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31780 |
DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval) Вставить - командой INSERT |
||
28 мар 17, 15:27 [20342028] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
Сиволапый, Зачем Вы в триггере фильтруете inserted по критерию UPDATE? inserted содержит тот набор данных, который вы уже определили в инструкции UPDATE, которая инициализировала срабатывание триггера. Перейдите по ссылке выше и ознакомьтесь с документацией иначе общение будет бесполезным |
28 мар 17, 15:31 [20342049] Ответить | Цитировать Сообщить модератору |
Сиволапый Member Откуда: Сообщений: 15 |
После долги мучительных проб и ошибок, получилось следующее:USE [ORION120TEST] GO /****** Object: Trigger [dbo].[trpTimeLogData_Inserted_Updated] Script Date: 03/28/2017 16:51:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER trigger [dbo].[trpTimeLogData_Inserted_Updated] on [dbo].[pLogData] instead of insert as begin set nocount on select * into #tmp from inserted update #tmp set timeval = DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval) where (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '08:30:00' and '08:59:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') insert into plogdata select * from #tmp drop table #tmp end На вид - работает. Посмотрите опытным взглядом, все тут верно? Заранее спасибо. |
28 мар 17, 15:40 [20342112] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
Сиволапый, Прошу прощения, что отвечаю вопросом на вопрос(но это определит ответ), у Вас реальная производственная задача и Вы не программист или Вы изучаете MSSQL (студент)? |
28 мар 17, 15:54 [20342196] Ответить | Цитировать Сообщить модератору |
Сиволапый Member Откуда: Сообщений: 15 |
iiyama, Задача реальная, производственная. Я не программист. И не студент тоже. Я IT инженер, сети, серверы, инфраструктура. Поставили задачу, открыл Managment Studio и начал читать и пробовать писать. Я первый раз провожу столько времени в Management Studio :) Просто задачу нужно решить, а делать тяп ляп запросами, планировщиком задач и sqlcmd не захотел. Вот полез дальше... |
28 мар 17, 18:40 [20343148] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
Сиволапый, ок, распишу как Вашу постановку понял я 1. У Вас какое-то приложение пишет лог в БД. Операция insert 2. Для определенных данных исходя из критерия: (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '08:30:00' and '08:59:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') вам нужно чтобы в лог записалось не то значение [timeval], которое передает приложение в команде insert,а измененное DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval) 3. Для данных, которые не удовлетворяют п.2 поле [timeval] записывается без изменений Если это так, то 1. приложение шлет insert 2. срабытывает триггер ALTER trigger [dbo].[trpTimeLogData_Inserted_Updated] on [dbo].[pLogData] instead of insert as begin set nocount on; insert into [dbo].[pLogData] values([timeval], [перечисляете остальные столбцы которые вставляете ] select case when (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '08:30:00' and '08:59:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval) else [timeval] end, [перечисляете остальные столбцы которые вставляете ] from inserted end |
28 мар 17, 19:25 [20343316] Ответить | Цитировать Сообщить модератору |
Сиволапый Member Откуда: Сообщений: 15 |
iiyama, Да, именно так. Но только у меня вот этих условий: when (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '08:30:00' and '08:59:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval) будет пять штук. На разное время и с разными расчётами. Сейчас просто не на работе, не могу проверить, как будет работать эта конструкция с несколькими when :) И по поводу столбцов, если я меняю только один столбец, перечислять я должен все равно ВСЕ имеющиеся в данной таблице столбцы? Ещё ради интереса хотел бы узнать чем плоха моя "конструкция"? :) Ну помимо того, что она выдергивает целиком все данные в новую таблицу... Спасибо Вам за помощь! |
28 мар 17, 20:04 [20343433] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31780 |
Последняя вставляет только те записи, которые нужно изменить, а правильные теряет, не вставляет. Триггер instead of выполняется вместо вставки, если вы сами там не вставите, то записей не будет.
|
||||
28 мар 17, 20:50 [20343554] Ответить | Цитировать Сообщить модератору |
Сиволапый Member Откуда: Сообщений: 15 |
Что то у меня опять с синтаксисом проблема, вот на это:USE [ORION120TEST] GO /****** Object: Trigger [dbo].[trpTimeLogData_Inserted_Updated] Script Date: 03/28/2017 16:51:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER trigger [dbo].[trpTimeLogData_Inserted_Updated] on [dbo].[pLogData] instead of insert as begin set nocount on; insert into [dbo].[pLogData] values([timeval], [NumCom], [IDComp], [Par1], [Par2], [Par3], [Par4], [Event], [IndexKey], [RazdIndex], [HozOrgan], [HozGuest], [Remark], [DoorIndex], [Mode], [DeviceTime], [VEvent], [ZReserv], [ZoneIndex], [ReaderIndex], [Sign], [tpRzdIndex], [tpPar4], [IndexZone], [tpIndex], [GUID]) select case when (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '08:30:00' and '08:59:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval) when HozOrgan = '116' and (CAST (timeval as time) between '09:00:00' and '09:29:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 - 40 - DATEPART (minute, timeval), timeval) when (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '12:00:00' and '12:29:59') and (Remark LIKE '%2: Выход%' or Remark LIKE '%3: Выход%' or Remark LIKE '%1: Выход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 + 30 - DATEPART (minute, timeval), timeval) when (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '14:00:00' and '14:29:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 - 15 - DATEPART (minute, timeval), timeval) when (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '17:30:00' and '17:59:59') and (Remark LIKE '%2: Выход%' or Remark LIKE '%3: Выход%' or Remark LIKE '%1: Выход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 + 5 + DATEPART (hour, timeval), timeval) else [timeval] end, ([timeval], [NumCom], [IDComp], [Par1], [Par2], [Par3], [Par4], [Event], [IndexKey], [RazdIndex], [HozOrgan], [HozGuest], [Remark], [DoorIndex], [Mode], [DeviceTime], [VEvent], [ZReserv], [ZoneIndex], [ReaderIndex], [Sign], [tpRzdIndex], [tpPar4], [IndexZone], [tpIndex], [GUID]) from inserted end он мне говорит - Сообщение 102, уровень 15, состояние 1, процедура trpTimeLogData_Inserted_Updated, строка 42 Неправильный синтаксис около конструкции ",". Пробовал убирать запятую, скобки, никак не работает. Пните? |
29 мар 17, 08:01 [20344388] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
убирайте скобки после case-а и не inserte, а inserted |
29 мар 17, 09:18 [20344584] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31780 |
И смотрите, написано select (поле, формируемое case), (поле1, поле2, ...) Видите, почему то поля после case указаны в скобках. Как это серверу понимать??? |
||
29 мар 17, 09:22 [20344610] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
Сиволапый, Пару советов. 1. Для отладки триггера закоментируйте insert
--insert into [dbo].[pLogData] values([timeval], [NumCom], [IDComp], [Par1], [Par2], [Par3], [Par4], [Event], [IndexKey], [RazdIndex], [HozOrgan], [HozGuest], [Remark], [DoorIndex], [Mode], [DeviceTime], [VEvent], [ZReserv], [ZoneIndex], [ReaderIndex], [Sign], [tpRzdIndex], [tpPar4], [IndexZone], [tpIndex], [GUID])
вместо вставки вам отобразится что вы пытаетесь добавить.2. Если выводится ошибка и не понимаете где она, закомментируйте подозрительный блок /* подозрительный блок */. Если ошибка пропала, и не понимаете где ошибка в блоке, то разбивайте его на более мелкие и тестируйте Удачи |
29 мар 17, 09:27 [20344637] Ответить | Цитировать Сообщить модератору |
Сиволапый Member Откуда: Сообщений: 15 |
USE [ORION120TEST] GO /****** Object: Trigger [dbo].[trpTimeLogData_Inserted_Updated] Script Date: 03/28/2017 16:51:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER trigger [dbo].[trpTimeLogData_Inserted_Updated] on [dbo].[pLogData] instead of insert as begin set nocount on; insert into [dbo].[pLogData] ( TimeVal , NumCom , IDComp , Par1 , Par2 , Par3 , Par4 , Event , IndexKey , RazdIndex , HozOrgan , HozGuest , Remark , DoorIndex , Mode , DeviceTime , VEvent , ZReserv , ZoneIndex , ReaderIndex , Sign , tpRzdIndex , tpPar4 , IndexZone , tpIndex , GUID) select case when (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '08:30:00' and '08:59:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval) when HozOrgan = '116' and (CAST (timeval as time) between '09:00:00' and '09:29:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 - 40 - DATEPART (minute, timeval), timeval) when (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '12:00:00' and '12:29:59') and (Remark LIKE '%2: Выход%' or Remark LIKE '%3: Выход%' or Remark LIKE '%1: Выход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 + 30 - DATEPART (minute, timeval), timeval) when (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '14:00:00' and '14:29:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 - 15 - DATEPART (minute, timeval), timeval) when (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '17:30:00' and '17:59:59') and (Remark LIKE '%2: Выход%' or Remark LIKE '%3: Выход%' or Remark LIKE '%1: Выход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 + 5 + DATEPART (hour, timeval), timeval) else [TimeVal] end , [NumCom] , [IDComp] , [Par1] , [Par2] , [Par3] , [Par4] , [Event] , [IndexKey] , [RazdIndex] , [HozOrgan] , [HozGuest] , [Remark] , [DoorIndex] , [Mode] , [DeviceTime] , [VEvent] , [ZReserv] , [ZoneIndex] , [ReaderIndex] , [Sign] , [tpRzdIndex] , [tpPar4] , [IndexZone] , [tpIndex] , [GUID] from inserted end Как то вот так... |
29 мар 17, 12:45 [20345832] Ответить | Цитировать Сообщить модератору |
Сиволапый Member Откуда: Сообщений: 15 |
Было бы здорово услышать мнение о "Как то вот так" :) Просто сейчас я делаю все на копии основной базы, на вид оно все работает, но когда повешаю этот триггер на основную базу, а в нем вдруг что то будет не так, не приятно получится... |
29 мар 17, 13:58 [20346349] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31780 |
|
||
29 мар 17, 14:06 [20346424] Ответить | Цитировать Сообщить модератору |
Сиволапый Member Откуда: Сообщений: 15 |
alexeyvg, Эта логика проверена уже на несколько десятков раз :) А ещё я хотел спросить у Вас, относительно вот этой моей "конструкции": USE [ORION120TEST] GO /****** Object: Trigger [dbo].[trpTimeLogData_Inserted_Updated] Script Date: 03/28/2017 16:51:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER trigger [dbo].[trpTimeLogData_Inserted_Updated] on [dbo].[pLogData] instead of insert as begin set nocount on select * into #tmp from inserted update #tmp set timeval = DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval) where (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '08:30:00' and '08:59:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') insert into plogdata select * from #tmp drop table #tmp end Вы говорили, что данная конструкция, теряет правильные записи. Я просто не совсем понял что имеется в виду под правильными записями. Если имеется в виду, что, например триггером было изменено значение времени с 08:45 на 08:25, то под правильной записью подразумевается 08:45? Теряются они, если я правильно понял из-за использования update, т.к. он находя соответствующую условию запись обновляет её... И если это так, то тогда куда же деваются правильные записи тут: USE [ORION120TEST] GO /****** Object: Trigger [dbo].[trpTimeLogData_Inserted_Updated] Script Date: 03/28/2017 16:51:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER trigger [dbo].[trpTimeLogData_Inserted_Updated] on [dbo].[pLogData] instead of insert as begin set nocount on; insert into [dbo].[pLogData] ( TimeVal , NumCom , IDComp , Par1 , Par2 , Par3 , Par4 , Event , IndexKey , RazdIndex , HozOrgan , HozGuest , Remark , DoorIndex , Mode , DeviceTime , VEvent , ZReserv , ZoneIndex , ReaderIndex , Sign , tpRzdIndex , tpPar4 , IndexZone , tpIndex , GUID) select case when (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '08:30:00' and '08:59:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 + 20 - DATEPART (minute, timeval), timeval) when HozOrgan = '116' and (CAST (timeval as time) between '09:00:00' and '09:29:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 - 40 - DATEPART (minute, timeval), timeval) when (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '12:00:00' and '12:29:59') and (Remark LIKE '%2: Выход%' or Remark LIKE '%3: Выход%' or Remark LIKE '%1: Выход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 + 30 - DATEPART (minute, timeval), timeval) when (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '14:00:00' and '14:29:59') and (Remark LIKE '%2: Вход%' or Remark LIKE '%3: Вход%' or Remark LIKE '%1: Вход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 - 15 - DATEPART (minute, timeval), timeval) when (HozOrgan = '49' or HozOrgan = '50' or HozOrgan = '51' or HozOrgan = '53' or HozOrgan = '54' or HozOrgan = '111' or HozOrgan = '112' or HozOrgan = '113' or HozOrgan = '115' or HozOrgan = '116' or HozOrgan = '117' or HozOrgan = '118' or HozOrgan = '119' or HozOrgan = '570') and (CAST (timeval as time) between '17:30:00' and '17:59:59') and (Remark LIKE '%2: Выход%' or Remark LIKE '%3: Выход%' or Remark LIKE '%1: Выход%') then DATEADD (minute, DATEPART (minute, timeval) % 10 + 5 + DATEPART (hour, timeval), timeval) else [TimeVal] end , [NumCom] , [IDComp] , [Par1] , [Par2] , [Par3] , [Par4] , [Event] , [IndexKey] , [RazdIndex] , [HozOrgan] , [HozGuest] , [Remark] , [DoorIndex] , [Mode] , [DeviceTime] , [VEvent] , [ZReserv] , [ZoneIndex] , [ReaderIndex] , [Sign] , [tpRzdIndex] , [tpPar4] , [IndexZone] , [tpIndex] , [GUID] from inserted end |
29 мар 17, 14:18 [20346514] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31780 |
|
||
29 мар 17, 14:40 [20346678] Ответить | Цитировать Сообщить модератору |
Сиволапый Member Откуда: Сообщений: 15 |
Спасибо всем за помощь! |
29 мар 17, 14:51 [20346784] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |