Inden du giver en løsning på spørgsmålet nogle få punkter på dit spørgsmål:
- 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).
- 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
- 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.
- 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.