ใช้ขั้นตอนที่เก็บไว้นี้:
IF (object_id('[dbo].[pResetIdentityField]') IS NULL)
BEGIN
EXEC('CREATE PROCEDURE [dbo].[pResetIdentityField] AS SELECT 1 FROM DUMMY');
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[pResetIdentityField]
@pSchemaName NVARCHAR(1000)
, @pTableName NVARCHAR(1000) AS
DECLARE @max INT;
DECLARE @fullTableName NVARCHAR(2000) = @pSchemaName + '.' + @pTableName;
DECLARE @identityColumn NVARCHAR(1000);
SELECT @identityColumn = c.[name]
FROM sys.tables t
INNER JOIN sys.schemas s ON t.[schema_id] = s.[schema_id]
INNER JOIN sys.columns c ON c.[object_id] = t.[object_id]
WHERE c.is_identity = 1
AND t.name = @pTableName
AND s.[name] = @pSchemaName
IF @identityColumn IS NULL
BEGIN
RAISERROR(
'One of the following is true: 1. the table you specified doesn''t have an identity field, 2. you specified an invalid schema, 3. you specified an invalid table'
, 16
, 1);
RETURN;
END;
DECLARE @sqlString NVARCHAR(MAX) = N'SELECT @maxOut = max(' + @identityColumn + ') FROM ' + @fullTableName;
EXECUTE sp_executesql @stmt = @sqlString, @params = N'@maxOut int OUTPUT', @maxOut = @max OUTPUT
IF @max IS NULL
SET @max = 0
print(@max)
DBCC CHECKIDENT (@fullTableName, RESEED, @max)
go
--exec pResetIdentityField 'dbo', 'Table'
เพียงแค่คำตอบของฉันกลับมาอีกครั้ง ฉันเจอพฤติกรรมแปลก ๆ ใน sql server 2008 r2 ที่คุณควรระวัง
drop table test01
create table test01 (Id int identity(1,1), descr nvarchar(10))
execute pResetIdentityField 'dbo', 'test01'
insert into test01 (descr) values('Item 1')
select * from test01
delete from test01
execute pResetIdentityField 'dbo', 'test01'
insert into test01 (descr) values('Item 1')
select * from test01
เลือกแรกผลิต 0, Item 1
ครั้งแรกที่เลือกผลิต
1, Item 1
คนที่สองผลิต หากคุณดำเนินการรีเซ็ตทันทีหลังจากตารางถูกสร้างขึ้นค่าถัดไปคือ 0 จริงๆแล้วฉันไม่แปลกใจเลยที่ Microsoft ไม่สามารถทำสิ่งนี้ให้ถูกต้องได้ ฉันค้นพบมันเพราะฉันมีไฟล์สคริปต์ที่เติมตารางการอ้างอิงที่บางครั้งฉันทำงานหลังจากที่ฉันสร้างตารางขึ้นใหม่และบางครั้งเมื่อตารางถูกสร้างขึ้นแล้ว