sql-server - DBCC 命令在程序内部不起作用

标签 sql-server t-sql stored-procedures dbcc

我有以下查询。从逻辑上讲,过程 usp_mytran 应该将表 dbo.Sales 的 Identity RESEED 为 1。但最后一个查询为 Max_ID_ValueCurrent_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

最佳答案

很抱歉回答我自己的问题。正如 @Kannan Kandasamy 所指出的,正是 ROLLBACK TRANSACTION 代码恢复了 DBCC CHECKIDENT 完成的工作。因此,为了使其正常工作,我创建了一个名为 Reseed_Sales 的作业,其中包含表 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

关于sql-server - DBCC 命令在程序内部不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40059040/

相关文章:

c# - 使用 EF 查询映射 sql 查询不起作用

sql-server - 在 ASP MVC 应用程序的服务器 session 中存储大量数据的最佳替代方案是什么?

sql-server - 使用单独架构上的 View 时,“对象的 SELECT 权限被拒绝”

sql - 如何在 Sql Server 中将序列类型从 int 更改为 bigint

Java - 无法从 MySQL StoredProcedure 返回/访问结果集

mysql - 如何验证 NULL/EMPTY 的 MYSQL 日期字段?

sql - SQL 中的动态 Like 语句

sql-server - 在 SQL 中连接多个表并获取 Count 数据

尽管更新了统计数据,SQL Server 2016 的查询计划估计仍然不正确

sql - 如果其中一个查询失败,存储过程会失败吗?