2

以下のクエリがあります。論理的には、プロシージャusp_mytranは table の Identity を 1 に RESEED する必要がありますdbo.Sales。しかし、最後のクエリは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
4

2 に答える 2

1

実際には、ストアド プロシージャ内で期待どおりに動作しています。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 を確認すると、ROLLBACK TRANSACTIONのために 2 が表示され、次の実行では 4 などが表示されます。

複数回実行した後、「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」として表示されます

以下の例も確認してください...

DBCC CHECKIDENT を使用して ID 列のカウントを再開した後、元の状態にロールバックできますか?

于 2016-10-15T13:13:16.700 に答える