Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-Konvertierungsspalte in eine Identitätsspalte

Leider können Sie ein Feld nicht in IDENTITY ändern auf einer vorhandenen Tabelle.

Sie sollten:

  • Erstellen Sie eine neue Tabelle mit der IDENTITY Feld
  • Geben Sie SET IDENTITY_INSERT ON aus für die neue Tabelle
  • Fügen Sie die Daten in die neue Tabelle ein
  • Geben Sie SET IDENTITY_INSERT OFF aus für die neue Tabelle
  • Lösche die alte Tabelle
  • Benennen Sie die neue Tabelle in den alten Namen um.

Sie können SSMS verwenden Um den Feldtyp zu ändern, wird dies alles hinter den Kulissen für Sie erledigt.

Hier ist eine Beispieltabelle:

CREATE TABLE plain (id INT NOT NULL PRIMARY KEY)

INSERT
INTO    plain
VALUES  (1000)

und das von SSMS generierte Skript :

SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_plain
    (
    id int NOT NULL IDENTITY (1, 1)
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_plain SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_plain ON
GO
IF EXISTS(SELECT * FROM dbo.plain)
     EXEC('INSERT INTO dbo.Tmp_plain (id)
        SELECT id FROM dbo.plain WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_plain OFF
GO
DROP TABLE dbo.plain
GO
EXECUTE sp_rename N'dbo.Tmp_plain', N'plain', 'OBJECT' 
GO
ALTER TABLE dbo.plain ADD CONSTRAINT
    PK__plain__3213E83F1A609306 PRIMARY KEY CLUSTERED 
    (
    id
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
COMMIT