5

我有一个数据库,其中包含许多标识列设置为[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; 

回答

9

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' 
+0

谢谢。在我的情况下,上面没有解决问题,如果复制数据库被复制并附加,这个命令将从数据库表中删除复制。我通过进入Management Studio>复制>本地发布节点解除了我的问题,并取消了从我的数据库复制。 – Zeeshanef 2015-01-31 15:52:23

+0

谢谢 - 这会删除我的本地数据库中的“NOT FOR REPLICATION”,但不适用于Azure数据库。任何想法如何? – Ian 2017-09-12 08:21:34

1

我发现sys.sp_identitycolumnforreplication没有在我的耳鼻喉科工作。 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 
+0

这适用于所有版本的SQL服务器,应该是最好的答案。感谢Abelian剧本 – kuklei 2017-11-02 18:21:08