从Database表的所有Identity列中删除[NOT FOR REPLICATION]

时间:2014-12-19 04:50:01

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

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

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

我尝试了这个,但它逐个删除。

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

2 个答案:

答案 0 :(得分:11)

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'

答案 1 :(得分:1)

我发现sys.sp_identitycolumnforreplication在我的Ent中没有用。 SQL 2008R2或SQL 2012实例(接下来将在2016年测试)。这个小片段对我有用。根据需要设置@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
相关问题