Odd SQL Server 2012 IDENTITY issue

前端 未结 2 1379
庸人自扰
庸人自扰 2020-12-18 01:39

I\'ve never seen this happen before, very odd.

I have a local SQL Server 2012 Express database that I\'m developing against. Running a simple suite of tests using th

相关标签:
2条回答
  • 2020-12-18 02:11

    This blog post has some additional details. It looks like in 2012, identity is implemented as a sequence. And by default, a sequence has a cache. If the cache is lost you lose the sequence values in the cache.

    The proposed solution is to create a sequence with no cache:

    CREATE SEQUENCE TEST_Sequence
        AS INT
        START WITH 1
        INCREMENT BY 1
        NO CACHE
    

    As far as I can see, the sequence behind an identity column is invisible. You can't change it's properties to disable caching.

    To use this with Entity Framework, you could set the primary key's StoredGeneratedPattern to Computed. Then you could generate the identity server-side in an instead of insert trigger:

    if exists (select * from sys.sequences where name = 'Sequence1')
        drop sequence Sequence1
    if exists (select * from sys.tables where name = 'Table1')
        drop table Table1
    if exists (select * from sys.triggers where name = 'Trigger1')
        drop trigger Trigger1
    go
    create sequence Sequence1
        as int
        start with 1
        increment by 1
        no cache
    go
    create table Table1
        (
        id int primary key,
        col1 varchar(50)
        )
    go
    create trigger Trigger1
        on Table1
        instead of insert
    as
    insert  Table1
            (ID, col1)
    select  next value for Sequence1
    ,       col1
    from    inserted
    go
    insert Table1 (col1) values ('row1');
    insert Table1 (col1) values ('row2');
    insert Table1 (col1) values ('row3');
    
    select  * 
    from    Table1
    

    If you find a better solution, let me know :)

    0 讨论(0)
  • 2020-12-18 02:11

    If you will call "Checkpoint" command after each insert query, it will solve your problem.

    For more information, please read out Checkpoint in SQL Server

    0 讨论(0)
提交回复
热议问题