有没有一种简单的方法从SQL Server 2005中的表中删除标识?
当我使用Management Studio时,它会生成一个脚本,用于创建没有标识的镜像表,复制数据,删除表,然后重命名镜像表等.此脚本中有5231行,因为此表/列有许多FK关系.
运行一个简单的改变/丢弃让我感觉更舒服.有任何想法吗?
编辑
我想我将使用企业管理器中的5,231行脚本.但是,我打算将它分解成更小的部分,我可以更好地运行和控制.这个表"行为"很奇怪,如果你试图删除1行(即使你刚插入一行,这不在任何其他FK表中),你会收到这个错误:
delete MyTable where MyPrimaryKey=1234 Msg 8621, Level 17, State 2, Line 1 The query processor ran out of stack space during query optimization. Please simplify the query.
毫无疑问,所有的FK.当我们进行这些架构和相关的应用程序更改时,我们将暂停对应用程序的所有访问并以单用户模式运行.但是,我们需要快速运行,我需要知道需要多长时间.我想我只需要测试,测试,测试.
如果您使用的是SQL Server 2005或更高版本,则可以将其作为简单的元数据更改(NB:不需要支持分区的版本,如我最初所述).
保罗·怀特(Paul White)对此Microsoft Connect项目的解决方法无耻地窃取了示例代码.
USE tempdb; GO -- A table with an identity column CREATE TABLE dbo.Source (row_id INTEGER IDENTITY PRIMARY KEY NOT NULL, data SQL_VARIANT NULL); GO -- Some sample data INSERT dbo.Source (data) VALUES (CONVERT(SQL_VARIANT, 4)), (CONVERT(SQL_VARIANT, 'X')), (CONVERT(SQL_VARIANT, {d '2009-11-07'})), (CONVERT(SQL_VARIANT, N'áéíóú')); GO -- Remove the identity property BEGIN TRY; -- All or nothing BEGIN TRANSACTION; -- A table with the same structure as the one with the identity column, -- but without the identity property CREATE TABLE dbo.Destination (row_id INTEGER PRIMARY KEY NOT NULL, data SQL_VARIANT NULL); -- Metadata switch ALTER TABLE dbo.Source SWITCH TO dbo.Destination; -- Drop the old object, which now contains no data DROP TABLE dbo.Source; -- Rename the new object to make it look like the old one EXECUTE sp_rename N'dbo.Destination', N'Source', 'OBJECT'; -- Success COMMIT TRANSACTION; END TRY BEGIN CATCH -- Bugger! IF XACT_STATE() <> 0 ROLLBACK TRANSACTION; PRINT ERROR_MESSAGE(); END CATCH; GO -- Test the the identity property has indeed gone INSERT dbo.Source (row_id, data) VALUES (5, CONVERT(SQL_VARIANT, N'This works!')) SELECT row_id, data FROM dbo.Source; GO -- Tidy up DROP TABLE dbo.Source;
我不相信你可以直接删除列的IDENTITY部分.你最好的选择可能是:
向表中添加另一个非标识列
将标识值复制到该列
删除原始标识列
重命名新列以替换原始列
如果标识列是键或其他约束的一部分,则需要删除这些约束并在完成上述操作后重新创建它们.
您可以向表中添加不是标识列的列,复制数据,删除原始列,并将新列重命名为旧列并重新创建索引.
这是一个显示示例的链接.仍然不是一个简单的改变,但它肯定比5231线更好.