Antes de dar uma solução para a pergunta, alguns pontos sobre sua pergunta:
- 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).
- 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
- 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.
- 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.