表上創建好了PK,卻發現了更大的麻煩:忘記將[ID] 字段設置成IDENTITY了:(
那可是幾百張表哪!那就編寫SQL腳本來搞定吧。
可是,這事沒有想象中那麼容易:ALTER TABLE不支持將某字段變更為IDENTITY (注:MS SQL Mobile是支持此語法的)
而且,若該字段上有PK、Index、Constrains等,必須先刪除才能DROP COLUMN.
注:
1)下面的代碼只處理了單個表的。整個DB中所有表,或者選擇一批表進行處理,是件很容易的事,讀者自己搞定吧。
2)這段代碼只是示例,作了很多簡化與假定:
- 簡化:不判斷是否存在特定名稱的PK;
- 假定:[ID]字段上沒有其它約束
- 假定:目標表的PK固定為PK_#Table#,目標字段為[ID]
- 假定:之前的ID數據沒有用(否則應該使用Move—>Rebuild-->MoveBack的方式)
----獻上代碼--------------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author: Yew
-- Create date: 2011-06-12
-- Description: 為某表設置IDENTITY(on ID)
-- =============================================
ALTER PROCEDURE [TOOL].[sp_Table_SetIdentity]
@Table varchar(100)
,@Schema varchar(100)
AS
BEGIN
DECLARE @vSQL nvarchar(max)
-- drop PK on [ID]
SET @vSQL = N'
ALTER TABLE #Schema#.#Table#
DROP CONSTRAINT PK_#Table#;
'
SET @vSQL = Replace(@vSQL, '#Table#', @Table)
SET @vSQL = Replace(@vSQL, '#Schema#', @Schema)
print @vSql
EXEC (@vSql)
-- rebuild IDENTITY column
SET @vSQL = N'
ALTER TABLE #Schema#.#Table#
DROP COLUMN [ID];
ALTER TABLE #Schema#.#Table#
ADD [ID] int IDENTITY(1, 1) NOT NULL;
ALTER TABLE [#Schema#].[#Table#] ADD CONSTRAINT [PK_#Table#] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = ON, ONLINE = OFF) ON [PRIMARY];
'
SET @vSQL = Replace(@vSQL, '#Table#', @Table)
SET @vSQL = Replace(@vSQL, '#Schema#', @Schema)
print @vSql
EXEC (@vSql)
END