有没有办法一次在特定数据库的所有表中添加自动增量?

时间:2017-07-17 11:57:33

标签: sql sql-server

我正在尝试在特定数据库中的所有现有表中添加自动增量,我可以通过表设计执行此操作,标记标识选项,但在这种情况下,我必须按表执行此表,并且是很多表。有没有办法自动完成?

2 个答案:

答案 0 :(得分:0)

可以使用' 光标'来完成,但您需要将自动增量所需的所有列添加到与 ID

Declare @Table nvarchar(50), @script nvarchar(100)

    DECLARE cur CURSOR FORWARD_ONLY READ_ONLY LOCAL FOR
        SELECT TABLE_SCHEMA + '.' + TABLE_NAME as 'Table' FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME not in ('sysdiagrams') -- You can exclude any table from this process by adding it on the where statement

    OPEN cur
    FETCH NEXT FROM cur INTO @Table
    WHILE @@FETCH_STATUS = 0 BEGIN
        -- The sql command to alter a Table and add Identity to it, you can change ID by any column in your tables 
        set @script = 'Alter Table '+ @Table +' ADD ID INT IDENTITY'


        EXEC sp_executesql @script

        FETCH NEXT FROM cur INTO @Table
    END

    CLOSE cur
    DEALLOCATE cur

编辑1 :根据您在评论中提出的要求

Declare @Table nvarchar(50), @script nvarchar(100), @primarykey_name nvarchar(20)

DECLARE cur CURSOR FORWARD_ONLY READ_ONLY LOCAL FOR
    SELECT TABLE_SCHEMA + '.' + TABLE_NAME as 'Table' FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME not in ('sysdiagrams') -- You can exclude any table from this process by adding it here 

OPEN cur
FETCH NEXT FROM cur INTO @Table
WHILE @@FETCH_STATUS = 0 BEGIN
    -- Find Primary key for the current Table and set it to @primarykey_name
    Set @primarykey_name = (SELECT c.NAME FROM sys.key_constraints kc INNER JOIN sys.index_columns ic ON kc.parent_object_id = ic.object_id  and kc.unique_index_id = ic.index_id
        INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
        WHERE kc.name='PK_'+ substring(@Table, 5, LEN(@Table)-4) and kc.type = 'PK')

    -- The sql command to alter a Table and add Identity to the primarykey of each table
    set @script = 'Alter Table '+ @Table +' ADD ' + @primarykey_name + ' INT IDENTITY'

    print @script
    --EXEC sp_executesql @script

    FETCH NEXT FROM cur INTO @Table
END

CLOSE cur
DEALLOCATE cur

答案 1 :(得分:0)

根据我的评论复制:

我不相信你会为多个表格找到一个自动选项。在表设计器中执行此操作时,SSMS创建的更改脚本已经完成了大量工作,您必须为任何其他解决方案重新创建。坦率地说,我不相信自己能像SSMS一样正确地做到这一点。

但是,如果它是足够多的表,我将使用更正的模式创建一个全新的数据库。确保新数据库中的所有内容都存在且正确。然后,将identity insert设置为新数据库中的所有表,复制数据,关闭所有标识插入,然后使用DETACH / ATTACH或BACKUP / RESTORE将新数据库移动到旧数据库。换句话说,我从头开始重建数据库,因为旧的模式已被彻底删除。但是,我需要一个很多决定在生产系统中这样做。

如果我绝对需要更改数据库文件名或数据库名,我只会执行DETACH / ATTACH或BACKUP / RESTORE。我实际上更喜欢将新数据库用作应用程序的新数据库。这也意味着如果我遇到麻烦,我可以很快换回旧的数据库。