Mengubah IDENTITY
properti benar-benar hanya metadata yang berubah. Tetapi untuk memperbarui metadata secara langsung, Anda harus memulai instance dalam mode pengguna tunggal dan mengotak-atik beberapa kolom di sys.syscolpars
dan tidak terdokumentasi/tidak didukung dan bukan sesuatu yang saya rekomendasikan atau akan saya berikan detail tambahannya.
Bagi orang-orang yang menemukan jawaban ini di SQL Server 2012+ sejauh ini, cara termudah untuk mencapai hasil kolom kenaikan otomatis ini adalah dengan membuat SEQUENCE
objek dan atur next value for seq
sebagai kolom default.
Sebagai alternatif, atau untuk versi sebelumnya (mulai 2005 dan seterusnya), solusi yang diposting pada item koneksi ini menunjukkan cara yang didukung sepenuhnya untuk melakukan ini tanpa memerlukan ukuran operasi data menggunakan ALTER TABLE...SWITCH
. Juga membuat blog tentang MSDN di sini. Meskipun kode untuk mencapai ini tidak terlalu sederhana dan ada batasan - seperti tabel yang diubah tidak dapat menjadi target batasan kunci asing.
Contoh kode.
Siapkan tabel pengujian tanpa identity
kolom.
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
Ubah menjadi identity
kolom (kurang lebih instan).
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;
Uji hasilnya.
INSERT INTO dbo.tblFoo (filler,filler2)
OUTPUT inserted.*
VALUES ('foo','bar')
Memberikan
bar filler filler2
----------- --------- ---------
10001 foo bar
Bersihkan
DROP TABLE dbo.tblFoo