Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Incrémentation des valeurs de clé primaire personnalisées dans SQL

Avant de donner une solution à la question quelques points sur votre question :

  1. Étant donné que la clé primaire personnalisée se compose principalement de trois parties, la date (140102), l'emplacement physique où la transaction a lieu (entityID), le numéro à 4 places (9999).
  2. Selon la conception, à une seule date dans un seul emplacement physique, il ne peut y avoir plus de 9 999 transactions. Ma solution contiendra également la même limitation.

Quelques points sur ma solution

  1. Le chiffre à 4 chiffres est lié à la date, ce qui signifie que pour une nouvelle date, le décompte commence à 0000. Par exempleGI_140102_1_0001,GI_140102_1_0002,GI_140102_1_0003,GI_140103_1_0000,GI_140104_1_0000

De toute façon, ce champ sera unique.

  1. La solution compare la dernière date de l'enregistrement à la date actuelle. La logique : si la date actuelle et la dernière date de l'enregistrement correspondent, puis elle incrémente le chiffre de 4 chiffres par la valeur de 1 si la date actuelle et la dernière date de l'enregistrement ne correspond pas, il définit le chiffre à 4 chiffres par la valeur 0000.

La solution :(le code ci-dessous donne la valeur qui sera le prochain GoodsInwardId, utilisez-le selon les besoins pour s'adapter à votre solution)

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 pour créer la structure requise (Probable Guess)

Pour le tableau :

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

Exemples d'enregistrements pour la table :

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');

** C'est une solution probable dans votre situation, bien que la solution idéale serait d'avoir une colonne d'identité (utilisez le réamorçage si nécessaire) et de la lier à la date actuelle en tant que colonne calculée.