Как установить начальное значение по умолчанию для всех идентификаторов в базе данных SQL Server? - PullRequest
2 голосов
/ 19 марта 2010

Есть ли способ указать серверу SQL использовать конкретное начальное значение по умолчанию для столбцов IDENTITY - при условии, что операторы CREATE TABLE (которые будут выполняться) не задают их? Меня не волнует изменение существующих данных или начальных значений для определенных столбцов IDENTITY. Мне нужно одинаковое начальное число для всех вновь создаваемых столбцов идентификаторов. Предположим, я не могу каким-либо образом изменить отдельные операторы CREATE TABLE.

1 Ответ

3 голосов
/ 19 марта 2010

синтаксис:

IDENTITY [ ( seed , increment ) ]

Вы должны указать и начальное значение, и приращение, или ни то, ни другое. Если ни то, ни другое не указано, по умолчанию используется значение (1,1). Невозможно установить другое глобальное значение по умолчанию, кроме (1,1). Единственный способ установить значение, отличное от (1,1), - это кодировать его в столбце.

вот документация: ИДЕНТИЧНОСТЬ (Собственность)

EDIT

На основании этой команды:

DBCC CHECKIDENT ( 'table_name', RESEED, new_reseed_value )

Вы можете использовать этот скрипт для сброса всех идентичных столбцов к одному @new_reseed_value значению:

DECLARE @Tables table (RowNumber int identity(1,1) primary key, TableCommand sysname)
DECLARE @new_reseed_value     int
       ,@CurrentRow           int
       ,@MaxRows              int
       ,@CurrentTableCommand  nvarchar(4000)

SET @new_reseed_value=9876

INSERT INTO @Tables
        (TableCommand)
    SELECT
        'DBCC CHECKIDENT ( ''['+SCHEMA_NAME( OBJECTPROPERTY( OBJECT_ID, 'SCHEMAID' ))
            +'].['+OBJECT_NAME( OBJECT_ID )+']'', RESEED, '+COALESCE(CONVERT(varchar(10),@new_reseed_value),'1')+' ) '
        FROM  SYS.COLUMNS
            WHERE COLUMNPROPERTY(OBJECT_ID, NAME, 'IsIdentity') = 1
            --AND exclude some tables here ifnecessary
SELECT @MaxRows=@@ROWCOUNT,@CurrentRow=0

WHILE @CurrentRow<@MaxRows
BEGIN
    SELECT @CurrentTableCommand=''
          ,@CurrentRow=@CurrentRow+1
    SELECT 
        @CurrentTableCommand=TableCommand
        FROM @Tables
        WHERE RowNumber=@CurrentRow
    --PRINT @CurrentTableCommand
    EXEC(@CurrentTableCommand)
END
...