删除标识或公式,删除并重新创建表

时间:2014-05-15 05:44:22

标签: sql sql-server identity

我想要的是在sql中为一列表设置或删除标识或公式,sql生成此代码:

CREATE TABLE dbo.Tmp_Table
    (
    a int NOT NULL IDENTITY (1, 1)
    )      ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_Table SET (LOCK_ESCALATION = TABLE)
GO

SET IDENTITY_INSERT dbo.Tmp_Table ON

GO
IF EXISTS(SELECT * FROM dbo.[Table])
     EXEC('INSERT INTO dbo.Tmp_Table (a)
        SELECT a FROM dbo.[Table] WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_Table OFF
GO
DROP TABLE dbo.[Table]
GO
EXECUTE sp_rename N'dbo.Tmp_Table', N'Table', 'OBJECT' 

我编写了一个脚本来设置或删除标识或公式,而不删除表并重新创建它,因为我没有列的所有信息,如主键或外键。 (我想创建这样的set NULL或者不是NULL,你只需要写一个列名和一个列类型)。

我该怎么做?有可能吗?

1 个答案:

答案 0 :(得分:1)

简短的回答是你不能轻易做到。如果要删除标识规范,则必须删除并重新创建列(这比删除表的侵入性小,但仍然很痛苦)。要保留数据,您需要创建没有标识规范的列副本,然后在删除原始列并重命名新列之前复制数据。

问题在于,如果您有一个引用该列的外键,那么您需要先删除它,然后再重新创建它。幸运的是,您可以通过查询系统目录视图来获取有关列的所有信息。你感兴趣的是:

  • sys.columns
  • sys.foreign_keys
  • sys.foreign_key_columns

您可能还需要sys.indexes,并且您希望检查is_primary_key = 1以获取有关主键的信息并获取您需要查看的PK列sys.index_columns。我不会详细说明如何将它们全部加入(它们都是链接的),因为你可以找到in the MSDN documentation

颈部摆脱身份规格是一种适当的痛苦,我感到痛苦 - 我自己就在那里。