将已有数据的表的[ID]字段变更为自增长 - MSSQL教程
发布时间:2013-12-28 18:32:29 所属栏目:MsSql教程 来源:站长网
导读:表上创建好了PK,却发现了更大的麻烦:忘记将[ID] 字段设置成IDENTITY了:( 那可是几百张表哪!那就编写SQL脚本来搞定吧。 可是,这事没有想象中那么容易:ALTER
|
表上创建好了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 (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

