1

Can we change step value of already existing identity column ? If yes what is the maximum value?

Thanks

gbn
  • 422,506
  • 82
  • 585
  • 676
Rajaram Shelar
  • 7,537
  • 24
  • 66
  • 107

3 Answers3

4

Yes, you have to create a copy of the new table, populate it with data from the old table, drop the old one, rename the copy. You can see how this works by changing the step size in the SSMS GUI and seeing what script is produced.

The maximum step size? Based on MSDN, I'd guess as high as your column datatype. So don't use 4000 increment starting at 1 for a tinyint etc

gbn
  • 422,506
  • 82
  • 585
  • 676
2

You can do this as a metadata only change. Example code below.

 --Seed Set to 1
CREATE TABLE dbo.tblFoo 
(
id INT IDENTITY(1,1) PRIMARY KEY,
baz INT
)


INSERT INTO dbo.tblFoo
SELECT TOP (10000) ROW_NUMBER() OVER (ORDER BY (SELECT 0))
FROM master..spt_values v1, master..spt_values v2


--Change Seed to 7
BEGIN TRY;
    BEGIN TRANSACTION;

    SELECT TOP 0 id 
    FROM dbo.tblFoo
    WITH (TABLOCKX,HOLDLOCK)



    DECLARE @TableScript nvarchar(max)
    SELECT @TableScript = 
    '
    CREATE TABLE dbo.Destination(
        id INT IDENTITY(' + 
                     CAST(ISNULL(IDENT_CURRENT('tblFoo'),0)+1 AS VARCHAR) + ',7)  PRIMARY KEY,
        baz INT
        )

        ALTER TABLE dbo.tblFoo SWITCH TO dbo.Destination;
    '       


    EXEC(@TableScript)


    DROP TABLE dbo.tblFoo;

    EXECUTE sp_rename N'dbo.Destination', N'tblFoo', 'OBJECT';


    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
    PRINT ERROR_MESSAGE();
END CATCH;

 INSERT INTO dbo.tblFoo 
 OUTPUT INSERTED.*     
 VALUES (1),(2)
Martin Smith
  • 438,706
  • 87
  • 741
  • 845
0

Only by recreating and repopulating the table

Oleg Dok
  • 21,109
  • 4
  • 45
  • 54