Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Incrementando valores de chave primária personalizados no SQL


Antes de dar uma solução para a pergunta, alguns pontos sobre sua pergunta:
  1. Como a chave primária personalizada consiste principalmente em três partes:Data (140102), local físico onde a transação ocorre (entityID), número de 4 lugares (9999).
  2. De acordo com o design em uma única data em um único local físico, não pode haver mais de 9.999 transações -- Minha Solução também conterá a mesma limitação.

Alguns pontos da minha solução
  1. O dígito de 4 casas está vinculado à data, o que significa que, para uma nova data, a contagem começa em 0000. Por exemplo

De qualquer forma, este campo será único.
  1. A solução compara a data mais recente no registro com a data atual. A lógica:Se a data atual e a data mais recente no registro corresponderem, então ela incrementa o dígito de 4 casas pelo valor em 1Se a data atual e a data mais recente no registro does not matchedThe ele define o dígito de 4º lugar pelo valor 0000.

A Solução:(O código abaixo fornece o valor que será o próximo GoodsInwardId, use-o conforme o requisito para se adequar à sua solução)
declare @previous nvarchar(30);
declare @today nvarchar(30);
declare @newID nvarchar(30);
select @previous=substring(max(GoodsInwardId),4,6) from SC_TD_GoodsInward;
Select @today=RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
+RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2);

if @[email protected]
BEGIN
Select @newID='GI_'+RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
+RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2)
+'_'+CONVERT(varchar,1)+'_'+(SELECT RIGHT('0000'+
CONVERT(VARCHAR,CONVERT(INT,RIGHT(MAX(GoodsInwardId),4))+1),4) 
from SC_TD_GoodsInward);
END
else
BEGIN
SET @newID='GI_'+RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
+RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2)
+'_'+CONVERT(varchar,1)+'_0000';
END
select @newID;

T-SQL para criar a estrutura necessária (Suposição Provável)

Para a mesa:
CREATE TABLE [dbo].[SC_TD_GoodsInward](
    [EntityId] [int] NULL,
    [GoodsInwardId] [nvarchar](30) NULL
)

Registros de amostra para a tabela:
insert into dbo.SC_TD_GoodsInward values(1,'GI_140102_1_0000');
insert into dbo.SC_TD_GoodsInward values(1,'GI_140101_1_9999');
insert into dbo.SC_TD_GoodsInward values(1,'GI_140101_1_0001');

**É uma solução provável na sua situação, embora a solução perfeita seja ter uma coluna de identidade (use reseed, se necessário) e vinculá-la à data atual como uma coluna computada.