28

基本的に、すべてのテーブルの Identity Increment を元にリセットする必要があります。ここでいくつかのコードを試しましたが、失敗します。

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 を修正するか、すべてのテーブルの ID を元の状態にリセットするにはどうすればよいですか?

4

11 に答える 11

68

シードとインクリメントが 1 でないテーブルがたくさんありますか??

そうでない場合 (デフォルトでは、すべてのテーブルにそれがあります)、次のコードを使用します。

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

MSforeachtable文書化されていませんが、データベース内のすべてのテーブルに対して特定のコマンドを実行する非常に便利なストアド プロシージャです。

完全に正確である必要がある場合は、次のステートメントを使用します。これにより、すべてのテーブルを元の SEED 値に再シードする SQL ステートメントのリストが生成されます。

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'

出力の最後の列を取得し、それらのステートメントを実行すれば完了です! :-)

( Pinal Daveのブログ投稿に触発された)

于 2010-03-02T16:36:23.557 に答える
14

marc_s の回答を微調整。

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

? を一重引用符で囲んだもの キャラ大事。このステートメントにより、SQL Server は各テーブルの次の ID 値を自動的に再計算します。

于 2010-05-18T14:47:38.573 に答える
8

スキーマをもう少しうまく処理するわずかなバリエーション...

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   
于 2010-12-02T15:27:29.230 に答える
7

テーブルにデータが含まれている場合、このコマンドを使用するときは注意してください。すべての新しい挿入により、重複エラーが発生します

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

問題を解決するには、その後これを実行する必要があります

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

これにより、データが存在する場合、シードが最後の列 ID にリセットされます

于 2015-06-25T22:13:20.567 に答える
2

ID 列を持つテーブルのみを再シードするには、次のスクリプトを使用できます。また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'
于 2012-01-28T20:44:46.193 に答える
2

簡単な方法は、sp_MSforeachtable コマンドを使用することです。このコマンドは、文書化されていませんが、テーブルを調べる比較的よく知られたコマンドです。

于 2010-03-02T16:37:20.180 に答える
0

以下のコードを使用してください。

CREATE TABLE #tmptable
(
    [seednvalue] int not null,
    [tablename] [nvarchar] (100) NULL
) 


declare @seedvalue AS INT
DECLARE @tablename AS VARCHAR(100)

Declare #tablesIdentityCursor CURSOR
    for 
    SELECT 
    IDENT_CURRENT(TABLE_NAME)+1 AS Current_Identity,
    TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'TableHasIdentity') = 1
    AND TABLE_TYPE = 'BASE TABLE'  --AND TABLE_NAME='test11'

delete from #tmptable
Open #tablesIdentityCursor
FETCH NEXT FROM #tablesIdentityCursor into @seedvalue, @tablename
WHILE @@FETCH_STATUS = 0 BEGIN

    Insert into #tmptable Select @seedvalue , @tablename   
    DBCC CHECKIDENT (@tablename, reseed, @seedvalue) 
    FETCH NEXT FROM #tablesIdentityCursor into @seedvalue, @tablename
END
CLOSE #tablesIdentityCursor
DEALLOCATE #tablesIdentityCursor
SELECT * FROM #tmptable
DROP TABLE #tmptable
于 2012-03-09T14:33:47.067 に答える
0

(この他のSOページから回答を再投稿しています)

おそらく最も簡単な方法は (クレイジーに聞こえるかもしれませんが、見た目がコード臭いかもしれません)、次のDBCC CHECKIDENTように 2 回実行することです。

-- sets all the seeds to 1
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'', RESEED, 1)'

-- run it again to get MSSQL to figure out the MAX/NEXT seed automatically
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'')'

終わり。

必要に応じて、もう一度実行して、すべてのシードがどのように設定されているかを確認できます。

-- run it again to display what the seeds are now set to
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'')'

これは、ドキュメントのコメントを利用するための創造的な方法です。

テーブルの現在の ID 値が ID 列に格納されている最大 ID 値より小さい場合、ID 列の最大値を使用してリセットされます。

于 2016-11-02T16:11:05.937 に答える