sql >> Database teknologi >  >> RDS >> Sqlserver

Forøgelse af tilpassede primærnøgleværdier i SQL

Inden du giver en løsning på spørgsmålet nogle få punkter på dit spørgsmål:

  1. Da den tilpassede primære nøgle hovedsageligt består af tre dele Dato(140102), fysisk placering, hvor transaktionen finder sted (entityID), 4 stedsnummer(9999).
  2. I henhold til designet på en enkelt dato på et enkelt fysisk sted kan der ikke være mere end 9999 transaktioner -- Min løsning vil også indeholde den samme begrænsning.

Nogle punkter på min løsning

  1. Cifferet med 4 pladser er bundet op på datoen, hvilket betyder, at for en ny dato starter optællingen fra 0000. For eksempelGI_140102_1_0001,GI_140102_1_0002,GI_140102_1_0003,GI_140103,GI_140101_0_01_01_01_01, 0_03, GI_140103, GI_140103, 0_01_01_01

På nogen måde vil dette felt være unikt.

  1. Løsningen sammenligner den seneste dato i posten med den aktuelle dato. Logikken:Hvis den aktuelle dato og den seneste dato i posten matcher, stiger den 4 pladscifre med værdien med 1Hvis den aktuelle dato og den seneste dato i posten matcher ikke. Det indstiller 4-pladscifferet med værdien 0000.

Løsningen:(Nedenfor koden angiver værdien, som vil være det næste GoodsInwardId, brug det efter krav for at passe ind i din løsning)

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 for at skabe den nødvendige struktur (sandsynligt gæt)

Til bordet:

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

Eksempelposter til tabellen:

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

**Det er en sandsynlig løsning i din situation, selvom den perfekte løsning ville være at have en identitetskolonne (brug reseed om nødvendigt) og binde den til den aktuelle dato som en beregnet kolonne.



  1. pg gem Trace/BPT-fælde:5 fejl på MAC OS X-løve

  2. Undgå array-overskrivning og opret i stedet nyt array-indeks

  3. MySQL:Begrænsning af et sæt kolonner, så mindst én ikke er NULL

  4. slet kolonne eksisterer ikke