sql >> データベース >  >> RDS >> Sqlserver

自動インクリメントの最適なアプローチとは

    次のように、出力ステートメントで update を使用できます。

    use tempdb
    
    go
    
    if object_id('Tokens', 'u') is not null drop table Tokens
    if object_id('GetNextToken', 'p') is not null drop procedure GetNextToken
    
    go
    
    create table Tokens (
        Id int identity(1,1) not null,
        Name varchar(50) not null,
        TokenFrom int not null,
        TokenTo int not null,
        LastUsedToken int null,
        constraint PK_Tokens primary key clustered (Id),
        constraint UQ_Tokens_Name unique (Name)
    )
    
    
    go
    
    insert into Tokens (Name, TokenFrom, TokenTo)
    select 'Ladies Section', 1, 50 union
    select 'Customer Care', 51, 350 union
    select 'Registration Section', 351, 550 union
    select 'Normal Customers', 551, 999
    
    go
    
    create procedure GetNextToken
        @name varchar(50),
        @token int output
    as
    begin
        declare @tokens table (token int)
    
        update Tokens
        set LastUsedToken = 
            case 
                when LastUsedToken is null then TokenFrom 
                when LastUsedToken = TokenTo then TokenFrom
                else LastUsedToken + 1
            end
        output inserted.LastUsedToken into @tokens
        where Name = @name
    
        set @token = (select top 1 token from @tokens)
    end
    
    go
    
    -- To get 'Ladies Section'
    declare @name varchar(50), @token int
    set @name = 'Ladies Section'
    exec GetNextToken @name, @token output
    select @token
    
    go
    
    -- To get 'Customer Care'
    declare @name varchar(50), @token int
    set @name = 'Customer Care'
    exec GetNextToken @name, @token output
    select @token
    
    go
    
    -- To get 'Registration Section'
    declare @name varchar(50), @token int
    set @name = 'Registration Section'
    exec GetNextToken @name, @token output
    select @token
    
    go
    
    -- To get 'Normal Customers'
    declare @name varchar(50), @token int
    set @name = 'Normal Customers'
    exec GetNextToken @name, @token output
    select @token
      


    1. 続編の移行と初期化を処理するためのワークフロー?

    2. Sphinx 2.0.4 MAMP 2.0でのインストールエラー:MySQLヘッダーが見つかりません

    3. flywaycleanはスケジューラージョブまたはプログラムをドロップしていません

    4. Oracleから次のn個のロック解除された行を取得するにはどうすればよいですか?