2

最後のカウントに基づいて選択したものを再シードする方法.最後のカウントに基づいて再シードするクエリを作成しました.しかし、一度に10個のテーブルを実行する方法について.

declare @last int
select @last=max(empid) from Table_1
DBCC CHECKIDENT (Table_1, RESEED, @last)

しかし、10を超えるテーブルまたは複数のテーブルの場合の方法...最後のカウントに基づいて一度に再シードする

4

3 に答える 3

6

必要なテーブルを繰り返し処理し、テーブルごとに上記のコマンドを実行します。

SQL ステートメントを動的に構築する必要があります。

たとえば、SQL Server 2008 R2 (使用しているものを指定しません) の場合、次のようにします。

DECLARE @tname SYSNAME, -- Will hold each table name
    @sname SYSNAME,     -- Will hold each table's schema name
    @idcol SYSNAME,     -- Will hold the name of identity column of each table
    @sql NVARCHAR(4000) -- To build each dynamic SQL statement

-- Declare a cursor to iterate through all table and schema names
-- of current database.
-- Add a WHERE clause here if needed.
DECLARE idtables CURSOR FOR
    SELECT name, SCHEMA_NAME(schema_id)
        FROM sys.tables

OPEN idtables

-- Fetch first table and schema name into the corresponding variables
FETCH NEXT FROM idtables INTO @tname, @sname
WHILE @@FETCH_STATUS = 0
BEGIN
    -- Ensure no dirty values if table has no identity column
    SET @idcol = NULL
    -- Build 1st statement.
    -- Objective: get identity column name, if any.
    SET @sql = 'SELECT @idcolname = name
        FROM sys.columns
        WHERE object_id = OBJECT_ID(''' + @sname + '.' + @tname + ''')
            AND is_identity = 1'
    -- Run the statement and store the result into @idcol
    EXEC sp_executesql @sql,
                       N'@idcolname sysname OUTPUT',
                       @idcolname = @idcol OUTPUT
    IF @idcol IS NOT NULL
    BEGIN
        -- Time for the 2nd statement.
        -- Objective: find the maximum identity value and reseed the table.
        SET @sql = 'DECLARE @lastid int;
            SELECT @lastid = MAX(' + @idcol + ')
                FROM [' + @sname + '].[' + @tname + '];
            IF @lastid IS NOT NULL
                DBCC CHECKIDENT (''' + @sname + '.' + @tname + ''', RESEED, @lastid)'
        EXEC SP_EXECUTESQL @sql
    END
    FETCH NEXT FROM idtables INTO @tname, @sname
END

CLOSE idtables
DEALLOCATE idtables
于 2013-07-11T14:26:02.987 に答える
0

Table_1 から @last=max(empid) を選択する必要はありません

DBCC CHECKIDENT (Table_1, RESEED) は最後の ID を取得します (empid が ID 列の場合)。

このコードは、すべてのテーブルを再シードします。

SET NOCOUNT ON
DECLARE @lcl_name VARCHAR(100)
DECLARE cur_name CURSOR FOR

SELECT TABLE_NAME 
FROM information_schema.tables
WHERE TABLE_TYPE = 'BASE TABLE' 

OPEN cur_name
FETCH NEXT FROM cur_name INTO @lcl_name
WHILE @@Fetch_status = 0
BEGIN

DBCC CHECKIDENT (@lcl_name, RESEED);

PRINT @lcl_name
FETCH NEXT FROM cur_name INTO @lcl_name
END
CLOSE cur_name
DEALLOCATE cur_name
SET NOCOUNT OFF
于 2013-09-20T18:51:20.577 に答える
0

私を穴から抜け出させてくれた素晴らしい答えをありがとう。ここに私のフルバージョンがあります

DECLARE @idcol nvarchar(max)
DECLARE @sql nvarchar(max)
DECLARE @sname nvarchar(max)
DECLARE @tname nvarchar(max)

DECLARE idtables CURSOR FOR 
SELECT t.name, s.name 
FROM sys.columns C
    INNER JOIN sys.tables T ON C.object_id = T.object_id
    INNER JOIN sys.schemas s ON S.schema_id = T.schema_id
WHERE is_identity = 1;

OPEN idtables

-- Fetch first table and schema name into the corresponding variables
FETCH NEXT FROM idtables INTO @tname, @sname
WHILE @@FETCH_STATUS = 0
BEGIN
    -- Ensure no dirty values if table has no identity column
    SET @idcol = NULL
    -- Build 1st statement.
    -- Objective: get identity column name, if any.
    SET @sql = 'SELECT @idcolname = name
        FROM sys.columns
        WHERE object_id = OBJECT_ID(''' + @sname + '.' + @tname + ''')
            AND is_identity = 1'
    -- Run the statement and store the result into @idcol
    EXEC sp_executesql @sql,
                       N'@idcolname sysname OUTPUT',
                       @idcolname = @idcol OUTPUT
    IF @idcol IS NOT NULL
    BEGIN
        -- Time for the 2nd statement.
        -- Objective: find the maximum identity value and reseed the table.
        SET @sql = 'DECLARE @lastid int;
            SELECT @lastid = MAX(' + @idcol + ')
                FROM [' + @sname + '].[' + @tname + '];
            IF @lastid IS NOT NULL
                DBCC CHECKIDENT (''' + @sname + '.' + @tname + ''', RESEED, @lastid)'
        EXEC SP_EXECUTESQL @sql
    END
    FETCH NEXT FROM idtables INTO @tname, @sname
END

CLOSE idtables
DEALLOCATE idtables
于 2014-05-17T16:07:53.363 に答える