Member 11820531 Ответов: 2

Как сбросить столбец идентификатора таблицы при достижении порогового значения?


Я оставляю большую часть своего sql, чтобы консолидировать свой вопрос. У меня есть временная таблица, объявленная следующим образом:

if OBJECT_ID('Tempdb..#RankCalendar','U') is not null
	drop table #RankCalendar 

CREATE TABLE #RankCalendar
(ID INT identity(0,1) 
,CalendarDate DATE
)
INSERT INTO #RankCalendar
SELECT 
 cal.CalendarDate
FROM tblCalendar cal


Это, по сути, вставляет значение даты (01/01/2002) в таблицу с начальным идентификатором 0. Однако мне нужно, чтобы ранг сбрасывался после каждого месяца. Так что, если предположить, что январь-мой первый месяц, то у меня будет:

| ID / CalendarDate |
| 0 | 01/01/2002 |
| 1 | 01/02/2002 |
| 2 | 01/03/2002 |


Это отлично подходит для января, но когда вводится 1 февраля, идентификатор равен 32, а не 0.
Есть какие-нибудь идеи или еще лучше решения о том, как с этим справиться?

Что я уже пробовал:

Я пробовал применять функции Dense_Rank и Lead безрезультатно. Я также попытался использовать подход sum over (), указанный в msdn.

Richard Deeming

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

Какие проблемы у вас были с использованием DENSE_RANK?

2 Ответов

Рейтинг:
1

Dave Kreskowiak

Вы можете "сбросить" столбец identity, выполнив эту инструкцию SQL:

DBCC CHECKIDENT ('tableNameGoesHere')


Если вы хотите повторно заполнить столбец известным значением, вы можете использовать:
DBCC CHECKIDENT ('tableNameGoesHere', RESEED, value)

Следующая запись, вставленная в таблицу, получит то значение, которое вы установили +1.


Member 11820531

Это скорее "постфактумный подход". В идеале я хотел бы контролировать повторный посев, когда моя временная таблица создается и заполняется. Я считаю, что ваше решение больше связано с "перманентной" таблицей. Хотя Спасибо за информацию!

Рейтинг:
0

Richard Deeming

Может ли что-то подобное сработать для вас?

if OBJECT_ID('Tempdb..#RankCalendar','U') is not null
	drop table #RankCalendar;
 
CREATE TABLE #RankCalendar
(
    ID INT NOT NULL, 
    CalendarDate DATE NOT NULL
);

INSERT INTO #RankCalendar
(
    ID,
    CalendarDate
)
SELECT 
    DENSE_RANK() OVER (PARTITION BY EOMONTH(cal.CalendarDate) ORDER BY cal.CalendarDate) - 1,
    cal.CalendarDate
FROM 
    tblCalendar cal
;


Member 11820531

EOMONTH не распознается как встроенная функция в моей БД. Мне придется изменить уровень совместимости моей базы данных. Решение моей проблемы состояло в том, что я не делал свой запрос более избирательным при его создании. Спасибо Вам за вашу информацию! Оглядываясь назад, мой вопрос не полностью заключал в себе то, чего я пытался достичь. Поэтому я не задал правильного вопроса. Спасибо снова.