Я понимаю, что поведение автоинкрементных полей идентификаторов изменилось в новейших версиях SQL Server. Я также понимаю, что «последовательное» поведение никогда не было гарантией для начала, но было приятно, что оно обычно демонстрировало поведение типа +1. 🙂
У меня есть приложение, которое пытается написать несколько записей довольно часто. SQL я бегу ниже. Я думал, что блок NOT EXISTS и TRY / CATCH предотвратит «попытку» уже существующей записи, предотвратив чрезвычайно высокое (и быстро растущее) поле идентификатора идентификатора, которое я использую. Пытался уберечь себя от необходимости сначала делать «SELECT», проверять результат, а затем делать INSERT, если он пустой (с использованием PHP). Я думал, что этот SQL сделает это для меня все сразу.
Я предполагаю, что моя настоящая обеспокоенность заключается в том, что при скорости, с которой растет мое числовое поле, это скоро станет проблемой. 🙂 Через 1 день это уже 90 000 000+ (это поле типа int).
Любые предложения по предотвращению этого?
IF (NOT EXISTS(SELECT
*
FROM
EventsTable
WHERE
EventType LIKE 'Alarm'
AND EventSource LIKE 'RackB, Circuit 4'
AND EventDescription LIKE 'Comm Timeout'
AND EventDateTime LIKE '08-05-2015 13:25:02'
AND EventLocation LIKE 'MT01')) BEGIN TRY INSERT
INTO
EventsTable
( EventDateTime, EventType, EventSource, EventDescription, EventSubSystemKey, EventViewKey, EventLocation, EventPriority )
VALUES
('08-05-2015 13:25:02','Alarm','RackB, Circuit 4','Comm Timeout','1','4','MT01','Notice')
END TRY BEGIN CATCH
END CATCH
Это может или не может быть верным ответом на вашу проблему, но это выскочило мне сразу:
AND EventDateTime LIKE '08-05-2015 13:25:02'
Это всегда вернется false
если твой EventDateTime
поле действительно DATETIME
тип. Поскольку это условие не может быть выполнено, NOT EXISTS
всегда сообщит, что данных нет. Таким образом, вы всегда будете вставлять данные, независимо от того, действительно ли они существуют в базе данных или нет.
Вы должны изменить свой LIKE
заявления должны быть =
, Ни один из VARCHAR
сравнения используют подстановочные знаки, и из того, что кажется, это ломает ваши DATETIME
сравнения.
Редактировать:
Если вам нужно использовать LIKE
с подстановочным знаком в этом утверждении, вам нужно будет разыграть EventDateTime
столбец к VARCHAR
за это. LIKE
не предназначен для обработки DATETIME
Тип данных (насколько я знаю), поэтому вам нужно сделать что-то вроде этого:
AND Convert(Varchar, EventDateTime, 121) LIKE '08-05-2015 13:25:02%'
Других решений пока нет …