sql >> Base de Datos >  >> RDS >> Sqlserver

Columna de conversión de SQL Server en una columna de identidad

Desafortunadamente, no puede cambiar un campo a IDENTITY en una tabla existente.

Deberías:

  • Cree una nueva tabla con la IDENTITY campo
  • Problema SET IDENTITY_INSERT ON para la nueva mesa
  • Insertar los datos en la nueva tabla
  • Problema SET IDENTITY_INSERT OFF para la nueva mesa
  • Deja la mesa vieja
  • Cambie el nombre de la nueva tabla al nombre anterior.

Puedes usar SSMS para cambiar el tipo de campo, hará todo esto detrás de escena.

Aquí hay una tabla de muestra:

CREATE TABLE plain (id INT NOT NULL PRIMARY KEY)

INSERT
INTO    plain
VALUES  (1000)

y el script generado por 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