Инкремент Идентификационных данных Сброса SQL Server для всех таблиц

В основном я должен сбросить Инкремент Идентификационных данных для всех таблиц к его оригиналу. Здесь я попробовал некоторый код, но он перестал работать.

http://pastebin.com/KSyvtK5b

Фактический код из ссылки:

USE World00_Character
GO

-- Create a cursor to loop through the System Ojects and get each table name
DECLARE TBL_CURSOR CURSOR
-- Declare the SQL Statement to cursor through
FOR ( SELECT Name FROM Sysobjects WHERE Type='U' )

-- Declare the @SQL Variable which will hold our dynamic sql
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = '';
-- Declare the @TblName Variable which will hold the name of the current table
DECLARE @TblName NVARCHAR(MAX);

-- Open the Cursor
OPEN TBL_CURSOR

-- Setup the Fetch While that will loop through our cursor and set @TblName
FETCH NEXT FROM TBL_CURSOR INTO @TblName
-- Do this while we are not at the end of the record set
WHILE (@@FETCH_STATUS <> -1)
BEGIN
-- Appeand this table's select count statement to our sql variable
SET @SQL = @SQL + ' ( SELECT '''+@TblName+''' AS Table_Name,COUNT(*) AS Count FROM '+@TblName+' ) UNION';

-- Delete info
EXEC('DBCC CHECKIDENT ('+@TblName+',RESEED,(SELECT IDENT_SEED('+@TblName+')))');

-- Pull the next record
FETCH NEXT FROM TBL_CURSOR INTO @TblName
-- End the Cursor Loop
END

-- Close and Clean Up the Cursor
CLOSE TBL_CURSOR
DEALLOCATE TBL_CURSOR

-- Since we were adding the UNION at the end of each part, the last query will have
-- an extra UNION. Lets  trim it off.
SET @SQL = LEFT(@SQL,LEN(@SQL)-6);

-- Lets do an Order By. You can pick between Count and Table Name by picking which
-- line to execute below.
SET @SQL = @SQL + ' ORDER BY Count';
--SET @SQL = @SQL + ' ORDER BY Table_Name';

-- Now that our Dynamic SQL statement is ready, lets execute it.
EXEC (@SQL);
GO

Сообщение об ошибке:

Error: Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '('.

Как я могу или зафиксировать тот SQL или сбросить идентификационные данные для всех таблиц к его оригиналу?

24
задан wonea 23 May 2018 в 09:46
поделиться

3 ответа

У вас много таблиц, которые не имеют seed и инкремент 1?

Если нет (по умолчанию все таблицы имеют такие значения), используйте этот код:

exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT(''?'', RESEED, 1)'

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

Если вам нужно быть абсолютно точным, используйте этот оператор - он сгенерирует список SQL-запросов для повторного засева всех таблиц до их первоначального значения SEED:

SELECT 
    IDENT_SEED(TABLE_NAME) AS Seed,
    IDENT_INCR(TABLE_NAME) AS Increment,
    IDENT_CURRENT(TABLE_NAME) AS Current_Identity,
    TABLE_NAME,
    'DBCC CHECKIDENT(' + TABLE_NAME + ', RESEED, ' + CAST(IDENT_SEED(TABLE_NAME) AS VARCHAR(10)) + ')'
FROM 
    INFORMATION_SCHEMA.TABLES
WHERE 
    OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'TableHasIdentity') = 1
    AND TABLE_TYPE = 'BASE TABLE'

Возьмите последний столбец в выводе, выполните эти операторы, и все готово! :-)

(вдохновленный записью в блоге Пинала Дейва)

63
ответ дан 28 November 2019 в 22:11
поделиться

Простым методом может быть использование команды sp_MSforeachtable, недокументированной, но относительно хорошо известной команды, которая просматривает ваши таблицы.

2
ответ дан 28 November 2019 в 22:11
поделиться

Небольшая поправка к ответу marc_s.

exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'', RESEED)'

Эти одинарные кавычки вокруг символа ? важны. Этот оператор заставит SQL Server автоматически пересчитать следующее значение идентичности для каждой таблицы.

13
ответ дан 28 November 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: