更改IDENTITY
屬性實際上是元數據只進行更改。但是,要直接更新元數據,需要在單用戶模式下啟動實例,并在sys.syscolpars
而且是沒有文件記錄的/沒有支持的,不是我會推薦的東西,也不是我會給出的任何其他細節。
對于在SQLServer 2012+上遇到這個答案的人來說,要實現自動遞增列的結果,最簡單的方法是創建一個SEQUENCE
對象并設置next value for seq
作為列的默認值。
或者,對于以前的版本(從2005年起),這個解決方案發布在此連接項顯示了一種完全支持的方法來完成此操作,而不需要使用ALTER TABLE...SWITCH
..還在MSDN上發表博客這里..盡管實現這一目標的代碼并不簡單,而且也存在一些限制-例如要更改的表不能成為外鍵約束的目標。
示例代碼。
設置測試表identity
列。
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
修改為有一個identity
列(或多或少是瞬間的)。
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 TRYBEGIN CATCH IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
PRINT ERROR_MESSAGE();END CATCH;
測試結果。
INSERT INTO dbo.tblFoo (filler,filler2) OUTPUT inserted.*VALUES ('foo','bar')
施予
bar filler filler2----------- --------- ---------10001 foo bar
洗凈
DROP TABLE dbo.tblFoo