Dan*_*Spd 24 sql identity reset
基本上我需要将所有表的Identity Increment重置为原始表.在这里我尝试了一些代码,但它失败了.
来自链接的实际代码:
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
Run Code Online (Sandbox Code Playgroud)
错误信息:
Error: Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '('.
Run Code Online (Sandbox Code Playgroud)
如何修复SQL或将所有表的标识重置为原始表?
mar*_*c_s 63
你有很多没有种子和增量1的桌子吗?
如果不是(默认情况下,所有表都有),请使用以下代码:
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT(''?'', RESEED, 1)'
Run Code Online (Sandbox Code Playgroud)
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'
Run Code Online (Sandbox Code Playgroud)
抓住输出中的最后一列,然后执行这些语句就完成了!:-)
(灵感来自Pinal Dave 的博客文章)
Agi*_*Jon 13
稍微调整一下marc_s的答案.
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'', RESEED)'
Run Code Online (Sandbox Code Playgroud)
那些单引号围绕?性格很重要.该语句将导致SQL Server自动重新计算每个表的下一个标识值.
处理Schema的轻微变化更好......
SELECT
IDENT_SEED(TABLE_SCHEMA+'.'+TABLE_NAME) AS Seed,
IDENT_INCR(TABLE_SCHEMA+'.'+TABLE_NAME) AS Increment,
IDENT_CURRENT(TABLE_SCHEMA+'.'+TABLE_NAME) AS Current_Identity,
TABLE_SCHEMA+'.'+TABLE_NAME,
'DBCC CHECKIDENT('''+TABLE_SCHEMA+'.'+TABLE_NAME+''', RESEED, '+CAST(IDENT_SEED(TABLE_SCHEMA+'.'+TABLE_NAME) AS VARCHAR(10))+')'
FROM
INFORMATION_SCHEMA.TABLES
WHERE
OBJECTPROPERTY(OBJECT_ID(TABLE_SCHEMA+'.'+TABLE_NAME), 'TableHasIdentity') = 1
AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, TABLE_NAME
Run Code Online (Sandbox Code Playgroud)
使用此命令时请小心,如果您的表包含数据,则所有新插入都将导致重复错误
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT(''?'', RESEED,1)'
Run Code Online (Sandbox Code Playgroud)
要解决之后需要运行的问题
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT(''?'', RESEED)'
Run Code Online (Sandbox Code Playgroud)
如果数据存在,这会将种子重置为最后一个列标识
要仅对具有标识列的表重新设定种子,您可以使用下一个脚本。它还利用sp_MSforeachtable但考虑到正确的表格。
EXEC sp_MSforeachtable '
IF (SELECT COUNT(1)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = ''BASE TABLE''
AND ''[''+ TABLE_SCHEMA + ''].['' + TABLE_NAME + '']'' = ''?''
AND OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), ''TableHasIdentity'') = 1) > 0
BEGIN
DBCC CHECKIDENT (''?'', RESEED, 1)
END'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27353 次 |
| 最近记录: |