Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Извлечение минимального значения из столбца c инкрементным наращиванием (IDENTITY)

36K
04 марта 2008 года
sqlnovichok
1 / / 04.03.2008
Здравствуйте. Имеется код (взял из MSDN). По описанию данный код находит пустые диапазоны в столбце из последовательности формируемой с помощью IDENTITY. Эти пустые диапазоны (значения) образуются когда строки удаляются из таблицы, но потом при вставке новой строки они не используются, а генерируются новые.
Код:
SET IDENTITY_INSERT Table1 ON
DECLARE @minidentval smallint
DECLARE @nextdentval smallint

SELECT @minidentval = MIN($IDENTITY) FROM Table1
IF @minidentval = IDENT_SEED('Table1')
SELECT @nextdentval = MIN($IDENTITY) + IDENT_INCR('Table1')
FROM Table1 t1
WHERE $IDENTITY BETWEEN IDENT_SEED('Table1') AND 32766 AND
NOT EXISTS (SELECT * FROM Table1 t2 WHERE t2.$IDENTITY =
t1.$IDENTITY + IDENT_INCR('Table1'))
ELSE
SELECT @nextdentval = IDENT_SEED('Table1')

SET IDENTITY_INSERT Table1 OFF

Очень интересует работа этого куска кода:
SELECT @nextdentval = MIN($IDENTITY) + IDENT_INCR('Table1')
FROM Table1 t1
WHERE $IDENTITY BETWEEN IDENT_SEED('Table1') AND 32766 AND
NOT EXISTS (SELECT * FROM Table1 t2 WHERE t2.$IDENTITY =
t1.$IDENTITY + IDENT_INCR('Table1'))
Если можно опишите ПОШАГОВО как происходит поиск значения nextdentval (имеется ввиду логика работы). Заранее благодарен.
Уточняю вопрос
возможно выражение WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('Table1') работает так:
можно написать WHERE t1.$IDENTITY + IDENT_INCR('Table1') = t2.$IDENTITY, тогда получается
выбрать те значения t1.$IDENTITY которые будучи увеличенными на IDENT_INCR('Table1') = 1
существуют и в t2.$IDENTITY. Тогда например результат может быть таким
Table_1 t2 t1
1 1 -
2 2 -
3 - 3
- - -
5 - -
- - -
7 7 -
8 - 8
т.к. например берем 1 из t1, увеличиваем ее на 1, получается 2, смотрим есть ли 2 в t2. Т.к.
такое значение имеется то заносим данное значение в результат выборки
SELECT * FROM Table1 t2 WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('Table1')
Аналогично со значением 2: 2 + 1 равно 3, а 3 также имеется в t2.$IDENTITY. Значит заносим
в результат выборки именно 2, а не 2 + 1 т.е. 3
Для 3 такие условия не выполняются т.к. 3 + 1 будет 4, а 4 в t2.$IDENTITY нет поэтому 3 не
заносится в результат выборки для t2 и т.д.
После этого применяется фильтр WHERE $IDENTITY BETWEEN IDENT_SEED('Table1') AND 32766 AND
NOT EXISTS и в итоге получается таблица t1
Первоначально я думал что работа выражения WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('Table1') для t2 дает следующие результаты
Table_1 t2
1 -
2 2
3 3
- -
5 -
- -
7 -
8 8
т.к. например берем t2.$IDENTITY = 1 ищем среди t1.$IDENTITY такие чтоб t1.$IDENTITY + IDENT_INCR('Table1') получилось 1, но таких среди первоначальных t1.$IDENTITY нет. Т.к. даже 1+1=2
Поэтому t2.$IDENTITY = 1 в выборку не заносим
Берем t2.$IDENTITY = 2 ищем среди t1.$IDENTITY такие чтоб t1.$IDENTITY + 1 получилось 2, этому
удовлетворяет значение t1.$IDENTITY = 1, т.к. 1+1=2. Поэтому t2.$IDENTITY = 2 в выборку заносим
и т.д.
Если кто разбирается помогите пожалуйста и скажите верны ли мои рассуждения.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог