Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server convertit la colonne en colonne d'identité

Malheureusement, vous ne pouvez pas changer un champ en IDENTITY sur une table existante.

Vous devez :

  • Créer une nouvelle table avec l'IDENTITY champ
  • Émettez SET IDENTITY_INSERT ON pour le nouveau tableau
  • Insérer les données dans le nouveau tableau
  • Émettez SET IDENTITY_INSERT OFF pour le nouveau tableau
  • Laisser tomber l'ancienne table
  • Renommer la nouvelle table avec l'ancien nom.

Vous pouvez utiliser SSMS pour changer le type de champ, il fera tout cela pour vous dans les coulisses.

Voici un exemple de tableau :

CREATE TABLE plain (id INT NOT NULL PRIMARY KEY)

INSERT
INTO    plain
VALUES  (1000)

et le script généré par SSMS :

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