【问题标题】:Remove [NOT FOR REPLICATION] from all Identity columns of Database tables从数据库表的所有标识列中删除 [NOT FOR REPLICATION]
【发布时间】:2014-12-19 04:50:00
【问题描述】:

我有一个数据库,其中包含许多将标识列设置为 [NOT FOR REPLICATION] 的表。在 SQL Server 2008 R2 中 有什么方法可以从 Management Studio 的所有表中删除此约束或任何查询谢谢。

Create Table mytbl (
[EmpId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,

我试过了,但它正在一个一个地删除。

ALTER TABLE dbo.tblAttendance ALTER COLUMN Id
         DROP NOT FOR REPLICATION;

【问题讨论】:

    标签: sql sql-server sql-server-2008-r2 replication identity-column


    【解决方案1】:

    Microsoft 提供了一个系统存储过程来打开和关闭 NOT FOR REPLICATION 设置。存储过程是sys.sp_identitycolumnforreplication。我们可以将此系统存储过程与 sp_msforeachtable 一起使用,以从所有表中删除 NOT FOR REPLICATION 设置:

    EXEC sp_msforeachtable @command1 = '
    declare @int int
    set @int =object_id("?")
    EXEC sys.sp_identitycolumnforreplication @int, 0'
    

    【讨论】:

    • 谢谢。在我的情况下,上面没有解决问题,如果复制的数据库被复制并附加,这个命令将从数据库表中删除复制。我通过进入 Management Studio >Replication>Local Publications 节点并取消选中我的数据库中的复制解决了我的问题。
    • 谢谢 - 这会删除我本地数据库上的 NOT FOR REPLICATION,但不适用于 Azure 数据库。知道怎么做吗?
    • “不起作用”我猜你收到了关于 sp_msforeachtable 的错误?我建议您生成一个脚本来创建所需的EXEC sys.sp_identitycolumnforreplication @int, 0 语句列表。
    【解决方案2】:

    我发现 sys.sp_identitycolumnforreplication 在我的 Ent 中不起作用。 SQL 2008R2 或 SQL 2012 实例(接下来将在 2016 年进行测试)。这个小sn-p对我有用。设置你认为合适的@debug,运行它,或者复制粘贴运行。

    set nocount on 
    declare @loop int = 1, @debug bit = 1, @schema sysname, @table sysname, @column sysname, @status int, @sqlStatement nvarchar(1000)
    declare repl_cursor cursor for 
    SELECT 
          [schema] = object_schema_name([object_id])
        , [table] = object_name([object_id])
        , [column] = [name] 
        , IsIdNotForRepl = COLUMNPROPERTY([object_id], [name], 'IsIdNotForRepl')
        , [--script] = 'alter table [' + object_schema_name([object_id]) + '].[' + object_name([object_id]) + '] alter column [' + [name] + '] DROP NOT FOR REPLICATION'
    FROM sys.columns
            WHERE 1=1
            and COLUMNPROPERTY([object_id], [name], 'IsIdNotForRepl') = 1
            and object_schema_name([object_id]) <> 'sys'
    order by 1,2
    
    open repl_cursor
    fetch next from repl_cursor into @schema, @table, @column, @status, @sqlStatement 
    WHILE @@FETCH_STATUS = 0
    BEGIN
        print '--loop: ' + cast(@loop as varchar(3)) + '; table: [' + @schema + '].[' + @table + '].[' + @column + ']; status = ' + case when isnull(@status,3) = 3 then 'NULL' else cast(@status as varchar(2)) end 
        print @sqlStatement + char(10)
    
        if @debug = 0 exec(@sqlStatement)
    
        FETCH NEXT FROM repl_cursor into @schema, @table, @column, @status, @sqlStatement 
        set @loop +=1
    END 
    
    close repl_cursor
    deallocate repl_cursor 
    go
    

    【讨论】:

    • 这适用于所有版本的 SQL Server,应该是最佳答案。感谢脚本阿贝尔
    • 也许您的兼容级别太旧了?
    • 这是本页的最佳答案
    猜你喜欢
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多