将标识列添加到SQL Server 2005中的非标识整数列

时间:2009-11-12 14:37:09

标签: sql-server sql-server-2005

我知道如何做到这一点,而且这已被许多人在STACK OVER以及束&一堆东​​西可以在网上找到。

然而,在谷歌搜索时,我遇到了一些有趣的东西(至少对我而言) adding IDENTITY to existing column

上述问题的解决方案(从该网站的底部获得)就像

sp_configure 'allow update', 1
go
reconfigure with override
go
 update syscolumns set colstat = 1
where id = object_id('table1') and name = 'ID'
go
 exec sp_configure 'allow update', 0
go
reconfigure with override
go

所以我用我的相应表格和列名给出了一个镜头,并找到了以下内容

Configuration option 'allow updates' changed from 1 to 1. Run the RECONFIGURE statement to install.
Msg 259, Level 16, State 1, Line 1
Ad hoc updates to system catalogs are not allowed.
Configuration option 'allow updates' changed from 1 to 0. Run the RECONFIGURE statement to install.

我做错了什么?

请帮忙

3 个答案:

答案 0 :(得分:2)

该代码示例,特别是表“syscolumns”,听起来像在SQL 2000中可能有效,可能是7.0。在这些版本中,可以使用显示的过程直接修改系统表。 (很久以前的一个晚上,我和一个朋友将SA帐户放在第二天正在重建的机器上......)

在SQL 2005中,Microsoft修改了SQL的内部,以便系统表不再可以直接访问或破解。各种“sys.XXX”系统表实际上是真实表的视图,并且这些表不能直接修改。 (实际上,我怀疑专门的黑客可以管理一些东西,但我还没有尝试过。)

“syscolumns”仍然存在于SQL 2005及更高版本中,但它可能只是sys.columns上的一个视图。

答案 1 :(得分:2)

引自Micheal Hotek

  

超过15岁   多年来,微软一直在讲述   大家不要直接更新系统   表和那个功能   将在以后删除。您   不能在Oracle或DB2中执行此操作。它   是一个非常糟糕的主意   非常糟糕的做法。在SQL中   Server 2000,有一个微不足道的   直接更新的案例数量   必须要做,因为没有   另一种方式。 (没有一个   会在这个线程中的例子   需要直接系统表   修改SQL Server 2000和   每个案例提供迄今为止的拧紧   与系统数据的结果   糟糕的代码遇到不好的做法。)   取消直接拧紧的能力   系统表中的数据是一个   用户请求,我就是其中之一   如果有人会尖叫的用户   决定这是一个好主意   带回某人的能力   完全爆炸了一个实例   点击一个按钮。重写   系统目录一如既往   将是一个非常糟糕的想法。

为了执行您想要执行的操作,您必须创建一个带有标识列的新表,将旧值复制到新表中,删除旧表并重命名新表。可以找到一个示例here

显然,如果你的表受到外键约束的影响,那将会更加痛苦,这些约束必须被删除并重新建立。

答案 2 :(得分:2)

嗯,你不能 - 期间。至少在SQL Server 2005及更高版本中没有。

您需要做的是添加一个新列作为INT IDENTITY,删除旧列,然后将新列重命名为旧名称。

它有点牵扯 - 但它有效,并且可靠地工作。

ALTER TABLE dbo.YourTable
  ADD NewColumn INT IDENTITY(1,1) 

ALTER TABLE dbo.YourTable
  DROP COLUMN OldColumn

EXEC sys.sp_rename @objname = 'dbo.YourTable.NewColumn', 
                   @newname = 'OldColumn', 
                   @objtype = 'COLUMN'