Генерация ежедневной последовательности / идентичности в SQL Server - PullRequest
0 голосов
/ 03 марта 2012

есть лучший способ получить ежедневную последовательность # из этого процесса sql

  DECLARE @id int

 UPDATE daily_identity 
 SET id = id + 1, @id = id + 1     
 WHERE day = CONVERT(VARCHAR(8), GETDATE(), 112) 
 IF @@ROWCOUNT = 0
     INSERT INTO daily_identity values ( CONVERT(VARCHAR(8), GETDATE(), 112), 1 )
     SELECT @id = 1
 END IF

 SELECT @id AS ‘id’

1 Ответ

1 голос
/ 03 марта 2012

Похоже, что произошел несчастный случай без очень жесткой транзакции.

РЕДАКТИРОВАТЬ : Подчеркнуто, что расчет Row_Number() зависит от нумерации всех строк.

Как насчет того, чтобы всегда делать INSERT и использовать результат для генерирования отображаемого ежедневного идентификатора?Видите ли вы что-нибудь полезное в этом:

-- Create some sample data.
declare @Today as Date = GetDate()
declare @Stuff as Table ( Id Int Identity, DateAdded Date )
insert into @Stuff ( DateAdded ) values
    ( DateAdd( day, -3, @Today ) ),
    ( DateAdd( day, -2, @Today ) ), ( DateAdd( day, -2, @Today ) ), 
    ( DateAdd( day, -1, @Today ) ), ( DateAdd( day, -1, @Today ) ),
    ( @Today ), ( @Today )

-- Display the test data.
select Id, DateAdded,
    Id - ( select Min( Id ) from @Stuff where DateAdded = S.DateAdded ) as DailyId,
    Row_Number() over ( partition by DateAdded order by Id ) as AlternativeDailyId,
    Convert( VarChar(8), DateAdded, 112 ) + '-' +
        Right( '000000' + Cast( Id - ( select Min( Id ) from @Stuff where DateAdded = S.DateAdded ) as VarChar(10) ), 6 ) as DateId
    from @Stuff as S

-- Add a row.
declare @NewRows as Table ( Id Int, DateAdded Date )
insert into @Stuff
    ( DateAdded )
    output inserted.Id, inserted.DateAdded into @NewRows
    values ( GetDate() )
-- Display the new Id.
--   Note the the   Row_Number()   calculation only works when all rows are counted.
select N.Id, N.DateAdded,
    N.Id - ( select Min( Id ) from @Stuff where DateAdded = N.DateAdded ) as DailyId, -- NB: References @Stuff.     
    Row_Number() over ( partition by N.DateAdded order by N.Id ) as AlternativeDailyId,
    Convert( VarChar(8), N.DateAdded, 112 ) + '-' +
        Right( '000000' + Cast( Id - ( select Min( Id ) from @Stuff where DateAdded = N.DateAdded ) as VarChar(10) ), 6 ) as DateId
    from @NewRows as N
select *
    from (
        select S.Id, S.DateAdded,
            S.Id - ( select Min( Id ) from @Stuff where DateAdded = S.DateAdded ) as DailyId, -- NB: References @Stuff.     
            Row_Number() over ( partition by S.DateAdded order by S.Id ) as AlternativeDailyId,
            Convert( VarChar(8), S.DateAdded, 112 ) + '-' +
                Right( '000000' + Cast( Id - ( select Min( Id ) from @Stuff where DateAdded = S.DateAdded ) as VarChar(10) ), 6 ) as DateId
            from @Stuff as S
        ) as X
    where Id in ( select Id from @NewRows )

Обратите внимание, что ужасные вещи произойдут, если строки будут удалены.Ежедневные идентификаторы будут пересчитываться захватывающими способами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...