Změna IDENTITY
vlastnost je ve skutečnosti pouze změna metadat. Přímá aktualizace metadat však vyžaduje spuštění instance v režimu jednoho uživatele a pohrát si s některými sloupci v sys.syscolpars
a je nezdokumentovaný/nepodporovaný a nejedná se o něco, co bych doporučoval nebo o čem bych poskytnul další podrobnosti.
Pro lidi, kteří se setkávají s touto odpovědí na SQL Server 2012+, by bylo zdaleka nejjednodušším způsobem, jak dosáhnout tohoto výsledku sloupce automatického zvyšování, vytvořit SEQUENCE
objekt a nastavte next value for seq
jako výchozí sloupec.
Alternativně nebo pro předchozí verze (od roku 2005 dále) ukazuje řešení uvedené na této položce připojení zcela podporovaný způsob, jak toho dosáhnout, aniž by bylo nutné provádět operace s daty pomocí ALTER TABLE...SWITCH
. Také se zde blogovalo o na MSDN. I když kód, jak toho dosáhnout, není příliš jednoduchý a existují omezení – například změna tabulky nemůže být cílem omezení cizího klíče.
Příklad kódu.
Nastavte testovací tabulku bez identity
sloupec.
CREATE TABLE dbo.tblFoo
(
bar INT PRIMARY KEY,
filler CHAR(8000),
filler2 CHAR(49)
)
INSERT INTO dbo.tblFoo (bar)
SELECT TOP (10000) ROW_NUMBER() OVER (ORDER BY (SELECT 0))
FROM master..spt_values v1, master..spt_values v2
Změňte jej tak, aby měl identity
sloupec (víceméně okamžitý).
BEGIN TRY;
BEGIN TRANSACTION;
/*Using DBCC CHECKIDENT('dbo.tblFoo') is slow so use dynamic SQL to
set the correct seed in the table definition instead*/
DECLARE @TableScript nvarchar(max)
SELECT @TableScript =
'
CREATE TABLE dbo.Destination(
bar INT IDENTITY(' +
CAST(ISNULL(MAX(bar),0)+1 AS VARCHAR) + ',1) PRIMARY KEY,
filler CHAR(8000),
filler2 CHAR(49)
)
ALTER TABLE dbo.tblFoo SWITCH TO dbo.Destination;
'
FROM dbo.tblFoo
WITH (TABLOCKX,HOLDLOCK)
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;
Otestujte výsledek.
INSERT INTO dbo.tblFoo (filler,filler2)
OUTPUT inserted.*
VALUES ('foo','bar')
Dává
bar filler filler2
----------- --------- ---------
10001 foo bar
Uklidit
DROP TABLE dbo.tblFoo