Below is an example that uses SWITCH
to move data into another table of identical schema that already has the IDENTITY
.
--create sample table and data
CREATE TABLE dbo.AddIdentityExample(
IncrementalColumn int NOT NULL
CONSTRAINT PK_AddIdentityExample PRIMARY KEY
, OtherData varchar(20) NULL
);
CREATE INDEX idx_AddIdentityExample_OtherData
ON dbo.AddIdentityExample(OtherData);
INSERT INTO dbo.AddIdentityExample VALUES
(1, 'Sample data one')
, (2, 'Sample data two')
, (3, 'Sample data three');
GO
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRAN;
--create staging table with same schema, indexes, and constraints
CREATE TABLE dbo.AddIdentityExampleStaging(
IncrementalColumn int IDENTITY NOT NULL --IDENTITY column property added
CONSTRAINT PK_AddIdentityExampleStaging PRIMARY KEY
, OtherData varchar(20) NULL
);
CREATE INDEX idx_AddIdentityExampleStaging_OtherData
ON dbo.AddIdentityExampleStaging(OtherData);
--move data from source table into new table
ALTER TABLE dbo.AddIdentityExample
SWITCH TO dbo.AddIdentityExampleStaging;
DROP TABLE dbo.AddIdentityExample;
--rename table
EXEC sp_rename
@objname = N'dbo.AddIdentityExampleStaging'
, @newname = N'AddIdentityExample'
, @objtype = 'OBJECT';
--rename constraints
EXEC sp_rename
@objname = N'dbo.PK_AddIdentityExampleStaging'
, @newname = N'PK_AddIdentityExample'
, @objtype = 'OBJECT';
--rename indexes
EXEC sp_rename
@objname = N'dbo.AddIdentityExample.idx_AddIdentityExampleStaging_OtherData'
, @newname = N'idx_AddIdentityExampleStaging_OtherData'
, @objtype = N'INDEX';
--seed IDENTITY with current max column value
DBCC CHECKIDENT(N'dbo.AddIdentityExample');
COMMIT;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
THROW;
END CATCH;
GO