DBCC 命令在程序内部不起作用
DBCC Command Not Working Inside Procedure
我有以下查询。从逻辑上讲,过程 usp_mytran
应该将 table dbo.Sales
的身份重新设置为 1。但是最后一个查询为 Max_ID_Value 和 Current_Seed_Value 返回了不同的值。谁能解释为什么 DBCC 命令在程序内部不起作用?
USE tempdb
-- Create table
CREATE TABLE dbo.Sales
(ID INT IDENTITY(1,1), Address VARCHAR(200))
GO
-- Procedure to Populate data into dbo.Sales
CREATE PROCEDURE usp_mytran
AS
BEGIN
BEGIN TRANSACTION
INSERT dbo.Sales
( Address )
VALUES ( 'Dwarka, Delhi' );
-- Delete it for some reason
DELETE FROM dbo.Sales;
-- Code to check max ID value, and verify it again IDENTITY SEED
DECLARE @MaxValue INT = (SELECT ISNULL(MAX(ID),1) FROM dbo.Sales)
IF @MaxValue IS NOT NULL AND @MaxValue <> IDENT_CURRENT('dbo.Sales')
DBCC CHECKIDENT ( 'tempdb.dbo.Sales', RESEED, @MaxValue );
ROLLBACK TRANSACTION
END
-- Ideally, this should RESEED the Identity of dbo.Sales table.
EXEC usp_mytran
-- Max_ID_Value & Current_Seed_Value should be same
SELECT ISNULL(MAX(ID),1) AS Max_ID_Value, IDENT_CURRENT('dbo.Sales') AS Current_Seed_Value FROM dbo.Sales
实际上它在存储过程中按预期工作:Rollback tran 将回滚 checkident 值 - 这就是代码中发生的事情
-- Procedure to Populate data into dbo.Sales
alter PROCEDURE usp_mytran
AS
BEGIN
BEGIN TRANSACTION
INSERT dbo.Sales
( Address )
VALUES ( 'Dwarka, Delhi' );
-- Delete it for some reason
DELETE FROM dbo.Sales;
-- Code to check max ID value, and verify it again IDENTITY SEED
DECLARE @MaxValue INT = (SELECT ISNULL(MAX(ID),1) FROM dbo.Sales)
IF @MaxValue IS NOT NULL AND @MaxValue <> IDENT_CURRENT('test.dbo.Sales')
DBCC CHECKIDENT ( 'test.dbo.Sales', RESEED, @MaxValue );
ROLLBACK TRANSACTION
END
如果你检查 ident_current 现在它显示 2 而在下一个 运行 它显示 4 等等 因为 ROLLBACK TRANSACTION
现在多次执行后检查"EXEC usp_mytran"
select IDENT_CURRENT('test.dbo.Sales')
您会看到 checkident 不会重置。
如果我们删除该事务,则 CHECKIDENT 将重新设定为 1。
下方评论交易
-- Procedure to Populate data into dbo.Sales
alter PROCEDURE usp_mytran
AS
BEGIN
--BEGIN TRANSACTION
INSERT dbo.Sales
( Address )
VALUES ( 'Dwarka, Delhi' );
-- Delete it for some reason
DELETE FROM dbo.Sales;
-- Code to check max ID value, and verify it again IDENTITY SEED
DECLARE @MaxValue INT = (SELECT ISNULL(MAX(ID),1) FROM dbo.Sales)
IF @MaxValue IS NOT NULL AND @MaxValue <> IDENT_CURRENT('test.dbo.Sales')
DBCC CHECKIDENT ( 'test.dbo.Sales', RESEED, @MaxValue );
--ROLLBACK TRANSACTION
END
现在多次执行后检查"EXEC usp_mytran"
select IDENT_CURRENT('test.dbo.Sales')
您将看到补种值为“1”
同时检查以下示例...
Can we rollback to original state after we have used DBCC CHECKIDENT to restart Identity column count?
很抱歉回答我自己的问题。正如@Kannan Kandasamy 所指出的,正是 ROLLBACK TRANSACTION
代码恢复了 DBCC CHECKIDENT
所做的工作。所以为了让它工作,我创建了一个名为 Reseed_Sales
的作业,其中包含用于 table dbo.Sales
的 RESEED Identity 的代码。下面是程序 usp_mytran
.
的最终查询
-- Procedure to Populate data into dbo.Sales
ALTER PROCEDURE usp_mytran
AS
BEGIN
BEGIN TRANSACTION
INSERT dbo.Sales
( Address )
VALUES ( 'Dwarka, Delhi' );
-- Delete it for some reason
DELETE FROM dbo.Sales;
-- Code to check max ID value, and verify it again IDENTITY SEED
DECLARE @MaxValue INT = (SELECT ISNULL(MAX(ID),1) FROM dbo.Sales)
IF @MaxValue IS NOT NULL AND @MaxValue <> IDENT_CURRENT('dbo.Sales')
EXEC msdb..sp_start_job @job_name = 'Reseed_Sales'
ROLLBACK TRANSACTION
END
我有以下查询。从逻辑上讲,过程 usp_mytran
应该将 table dbo.Sales
的身份重新设置为 1。但是最后一个查询为 Max_ID_Value 和 Current_Seed_Value 返回了不同的值。谁能解释为什么 DBCC 命令在程序内部不起作用?
USE tempdb
-- Create table
CREATE TABLE dbo.Sales
(ID INT IDENTITY(1,1), Address VARCHAR(200))
GO
-- Procedure to Populate data into dbo.Sales
CREATE PROCEDURE usp_mytran
AS
BEGIN
BEGIN TRANSACTION
INSERT dbo.Sales
( Address )
VALUES ( 'Dwarka, Delhi' );
-- Delete it for some reason
DELETE FROM dbo.Sales;
-- Code to check max ID value, and verify it again IDENTITY SEED
DECLARE @MaxValue INT = (SELECT ISNULL(MAX(ID),1) FROM dbo.Sales)
IF @MaxValue IS NOT NULL AND @MaxValue <> IDENT_CURRENT('dbo.Sales')
DBCC CHECKIDENT ( 'tempdb.dbo.Sales', RESEED, @MaxValue );
ROLLBACK TRANSACTION
END
-- Ideally, this should RESEED the Identity of dbo.Sales table.
EXEC usp_mytran
-- Max_ID_Value & Current_Seed_Value should be same
SELECT ISNULL(MAX(ID),1) AS Max_ID_Value, IDENT_CURRENT('dbo.Sales') AS Current_Seed_Value FROM dbo.Sales
实际上它在存储过程中按预期工作:Rollback tran 将回滚 checkident 值 - 这就是代码中发生的事情
-- Procedure to Populate data into dbo.Sales
alter PROCEDURE usp_mytran
AS
BEGIN
BEGIN TRANSACTION
INSERT dbo.Sales
( Address )
VALUES ( 'Dwarka, Delhi' );
-- Delete it for some reason
DELETE FROM dbo.Sales;
-- Code to check max ID value, and verify it again IDENTITY SEED
DECLARE @MaxValue INT = (SELECT ISNULL(MAX(ID),1) FROM dbo.Sales)
IF @MaxValue IS NOT NULL AND @MaxValue <> IDENT_CURRENT('test.dbo.Sales')
DBCC CHECKIDENT ( 'test.dbo.Sales', RESEED, @MaxValue );
ROLLBACK TRANSACTION
END
如果你检查 ident_current 现在它显示 2 而在下一个 运行 它显示 4 等等 因为 ROLLBACK TRANSACTION
现在多次执行后检查"EXEC usp_mytran"
select IDENT_CURRENT('test.dbo.Sales')
您会看到 checkident 不会重置。
如果我们删除该事务,则 CHECKIDENT 将重新设定为 1。
下方评论交易
-- Procedure to Populate data into dbo.Sales
alter PROCEDURE usp_mytran
AS
BEGIN
--BEGIN TRANSACTION
INSERT dbo.Sales
( Address )
VALUES ( 'Dwarka, Delhi' );
-- Delete it for some reason
DELETE FROM dbo.Sales;
-- Code to check max ID value, and verify it again IDENTITY SEED
DECLARE @MaxValue INT = (SELECT ISNULL(MAX(ID),1) FROM dbo.Sales)
IF @MaxValue IS NOT NULL AND @MaxValue <> IDENT_CURRENT('test.dbo.Sales')
DBCC CHECKIDENT ( 'test.dbo.Sales', RESEED, @MaxValue );
--ROLLBACK TRANSACTION
END
现在多次执行后检查"EXEC usp_mytran"
select IDENT_CURRENT('test.dbo.Sales')
您将看到补种值为“1”
同时检查以下示例...
Can we rollback to original state after we have used DBCC CHECKIDENT to restart Identity column count?
很抱歉回答我自己的问题。正如@Kannan Kandasamy 所指出的,正是 ROLLBACK TRANSACTION
代码恢复了 DBCC CHECKIDENT
所做的工作。所以为了让它工作,我创建了一个名为 Reseed_Sales
的作业,其中包含用于 table dbo.Sales
的 RESEED Identity 的代码。下面是程序 usp_mytran
.
-- Procedure to Populate data into dbo.Sales
ALTER PROCEDURE usp_mytran
AS
BEGIN
BEGIN TRANSACTION
INSERT dbo.Sales
( Address )
VALUES ( 'Dwarka, Delhi' );
-- Delete it for some reason
DELETE FROM dbo.Sales;
-- Code to check max ID value, and verify it again IDENTITY SEED
DECLARE @MaxValue INT = (SELECT ISNULL(MAX(ID),1) FROM dbo.Sales)
IF @MaxValue IS NOT NULL AND @MaxValue <> IDENT_CURRENT('dbo.Sales')
EXEC msdb..sp_start_job @job_name = 'Reseed_Sales'
ROLLBACK TRANSACTION
END