Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Где хранится последнее значение автоинкрементного поля ???  [new]
__Сережка__
Guest
Всем доброе утро! Подскажите пожалуйста что сделать:

переносил базу с ACCESS ( где ключ был рандом ) на SQL Server
на SQL поставил автоинкремент с identity seed 1 и получилось так
нехорошо что значение поля достигло максимального значения.
Причем записей всего 300 000.

Знаю что SQL хранит последнее значение этого поля где то
в системных таблицах. Хочу поставить туда другое число, дыр огромных много в значениях.
Можно так сделать и где это хранится ?
24 июн 11, 06:08    [10866366]     Ответить | Цитировать Сообщить модератору
 Re: Где хранится последнее значение автоинкрементного поля ???  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
IDENT_CURRENT()
24 июн 11, 06:14    [10866373]     Ответить | Цитировать Сообщить модератору
 Re: Где хранится последнее значение автоинкрементного поля ???  [new]
__Сережка__
Guest
т.е. напрямую записывать в таблицу нельзя ? или как ? эта функция покажет последнее значение, а как мне его изменить ?
24 июн 11, 06:16    [10866374]     Ответить | Цитировать Сообщить модератору
 Re: Где хранится последнее значение автоинкрементного поля ???  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
DBCC CHECKIDENT
24 июн 11, 06:17    [10866375]     Ответить | Цитировать Сообщить модератору
 Re: Где хранится последнее значение автоинкрементного поля ???  [new]
__Сережка__
Guest
Спасибо большое,
я понимаю что все читающие и пишушие тут мега гуру но можно ли написать для нубов как корректно вызвать функцию ?
24 июн 11, 06:19    [10866376]     Ответить | Цитировать Сообщить модератору
 Re: Где хранится последнее значение автоинкрементного поля ???  [new]
__Сережка__
Guest
Спасибо большое
24 июн 11, 06:22    [10866378]     Ответить | Цитировать Сообщить модератору
 Re: Где хранится последнее значение автоинкрементного поля ???  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
__Сережка__
Спасибо большое,
я понимаю что все читающие и пишушие тут мега гуру но можно ли написать для нубов как корректно вызвать функцию ?
Какую именно?
Функция функции - рознь (с)
24 июн 11, 06:23    [10866379]     Ответить | Цитировать Сообщить модератору
 Re: Где хранится последнее значение автоинкрементного поля ???  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
Изменить значение автоинкрементного поля


set identity_insert [ИМЯ_ТАБЛИЦЫ] on -- делаем сначала это
...
здесь меняем данные (update... или insert..)
...
set identity_insert [ИМЯ_ТАБЛИЦЫ] off -- после всех изменений возвращаем на место
24 июн 11, 09:50    [10866689]     Ответить | Цитировать Сообщить модератору
 Re: Где хранится последнее значение автоинкрементного поля ???  [new]
dmitry.sloutskov
Guest
Без автоинкриментного поля в рабочей таблице...
procedure dbo.Identity_Create
(
@name varchar(40) ,
@starting int = 1 ,
@increment int = 1
)
as
begin
set NOCOUNT on ;
if (not exists ( select null
from msdb.sys.objects
where object_id = object_id('[msdb].dbo.[' + ltrim(rtrim(@name)) + ']') and type in (N'U') ))
begin
declare @sql varchar(255)
set @sql = 'create table [msdb].dbo.[' + ltrim(rtrim(@name)) + '] ([value] int identity (' + convert(varchar(10), @starting) + ',' + convert(varchar(10), @increment) + '))'
exec (@sql)
end
end

procedure [dbo].[GetNextIdentity]
(
@name varchar(40)
)
as
begin
set NOCOUNT on ;
declare @sql varchar(255)
declare @result int
begin transaction get_next_identity
set @sql = 'insert into [msdb].dbo.[' + ltrim(rtrim(@name)) + '] default values;'
exec (@sql)
set @result = dbo.GetIdentity(@name)
rollback transaction get_next_identity
return @result
end

function [dbo].[GetIdentity] (@name varchar(40))
returns int
as
begin
return ident_current('[msdb].dbo.[' + ltrim(rtrim(@name)) + ']')
end

exec dbo.Identity_Create @name = 'entity_number'
exec @number = dbo.GetNextIdentity @name = 'entity_number'

как-то так...
24 июн 11, 10:03    [10866766]     Ответить | Цитировать Сообщить модератору
 Re: Где хранится последнее значение автоинкрементного поля ???  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ART-CODE
Изменить значение автоинкрементного поля


set identity_insert [ИМЯ_ТАБЛИЦЫ] on -- делаем сначала это
...
здесь меняем данные (update... или insert..)
...
set identity_insert [ИМЯ_ТАБЛИЦЫ] off -- после всех изменений возвращаем на место
Не знаете, а пишете...
IDENTITY_INSERT влияет только на INSERT. Это даже из названия сразу видно. Апдейтить IDENTITY нельзя ни при каких условиях.
Кроме того, это никак не повлияет на последующие автоматические вставки IDENTITY.
24 июн 11, 10:11    [10866823]     Ответить | Цитировать Сообщить модератору
 Re: Где хранится последнее значение автоинкрементного поля ???  [new]
dmitry.sloutskov
Guest
__Сережка__,

А хочется то чего? "Дырки заткнуть" или понять отчего они возникают?

Для "затыкания" я использую такой способ:
1. Добавляем в табличку " [гуидное_поле]" поле со значением по умолчанию newid()
2. Переливаем пару [автоинкриментное_поле], [гуидное_поле].
3. Убиваем [автоинкриментное_поле].
4. Создаём [новое_автоинкриментное_поле].
5. По сохранённым парам ([автоинкриментное_поле], [гуидное_поле]) восстанавливаем связи, обновив другие таблицы на новое значение ключа.
6. Удаляем [гуидное_поле].

А возникают "дырки" от незавершившихся insert, поскольку новое значение identity выдаётся сразу перед добавлением записи.
24 июн 11, 11:01    [10867199]     Ответить | Цитировать Сообщить модератору
 Re: Где хранится последнее значение автоинкрементного поля ???  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Затыкать "дырки" в IDENTITY - полная бессмыслица.
Если речь о нумерации, то и должно быть отдельное поле с номером.
Вот там и ликвидировать эти самые "дырки".
А IDENTITY - не для этого.
24 июн 11, 12:04    [10867925]     Ответить | Цитировать Сообщить модератору
 Re: Где хранится последнее значение автоинкрементного поля ???  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
iap
Апдейтить IDENTITY нельзя ни при каких условиях.
Кроме того, это никак не повлияет на последующие автоматические вставки IDENTITY.

Да, промахнулся я с апдейтом.
Ну тогда пересоздать таблицу.
24 июн 11, 13:42    [10868993]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить