本文将介绍当您无法于 SQL Database 利用 DBCC CHECKIDENT 重新设定识别值时的替代作法。
【情境说明】
在论坛上有朋友讨论到 SQL Database 不支持使用 DBCC CHECKIDENT 来重设识别值,是否有其他替代方案?在 SQL Azure 官方论坛上看到有国外的朋友提出变通的作法以及小朱版主提到砍掉数据表重建的方式有异曲同工之妙,笔者将之实践步骤整理如下,在此跟大家分享。
【前置作业】
首先笔者在 SQL Database 管理入口网站利用网站提供的设计工具来建立一个测试数据表(Table1),包含 ID、c1 和 c2 等三个字段,其中 ID 为 identity。
接着点选【New Query】,接着输入下列的 T-SQL 后按【Run】来新增测试数据。
1: INSERT INTO Table1(c1,c2) VALUES ('a','aa'),('b','bb'),('c','cc')
执行结果如下:
若您尝试在 SQL Database 上执行 DBCC CHECKIDENT 命令,将会发生【DBCC command 'CHECKIDENT' is not supported in this version of SQL Server.】的错误消息。
【解决方式】
假设您利用 T-SQL 删除 ID 大于 1 的数据只留一笔数据,若后续再利用 INSERT 叙述来新增数据时,依照识别字段的特性,除非利用 DBCC CHECKIDENT 来重设识别值,否则 ID 会从 4 开始累加。但由于 SQL Database 不支持 DBCC CHECKIDENT,若您想要让识别值从 2 开始,您可以利用下列T-SQL 来达到相同目的:
1: --故意删除ID大于1的数据
2: DELETE Table1 WHERE id > 1
3: GO
4:
5:
6: --STEP 1、建立临时数据表
7: IF OBJECT_ID('dbo.Table1_temp') IS NOT NULL
8: DROP TABLE Table1_temp
9: GO
10:
11: CREATE TABLE Table1_temp (id int identity primary key,c1 nvarchar(50),c2 nvarchar(15))
12:
13: --STEP 2、允许将明确的值插入数据表的识别字段中
14: SET IDENTITY_INSERT TestDB.dbo.Table1_temp ON
15:
16: --STEP 3、插入数据到临时数据表
17: INSERT INTO Table1_temp(ID,c1,c2)
18: SELECT * FROM Table1
19:
20: --STEP 4、关闭允许将明确的值插入数据表的识别字段中
21: SET IDENTITY_INSERT TestDB.dbo.Table1_temp OFF
22: GO
23:
24: --STEP 5、删除原始数据表
25: DROP TABLE Table1
26:
27: --STEP 6、将临时数据表改为原始数据表
28: EXEC dbo.sp_rename @objname = N'[dbo].[Table1_temp]', @newname = N'Table1', @objtype = N'OBJECT'
29:
30: --STEP 7、插入数据
31: INSERT INTO Table1(c1,c2) VALUES ('b','bb'),('c','cc')
32:
33: SELECT *
34: FROM Table1
实际画面如下:
当执行完毕之后您将看到新增的数据可以从 ID 等于 2 开始插入,而不是从 4 开始,用到的概念是先建立一个和原始数据表(Table1)结构相同的临时表,接着利用 SET IDENTITY_INSERT ON 选向来开启可以插入识别字段的值,就可以达到类似重新设定识别值的效果(执行结果如下)。
【参考数据】
- DBCC CHECKIDENT (Transact-SQL)
- SQL AZURE - Identity Reseed
原文:大专栏 无法于 SQL Database 利用 DBCC CHECKIDENT 重新设定识别值时的替代作法