Innan du ger en lösning på frågan några punkter på din fråga:
- Den anpassade primärnyckeln består huvudsakligen av tre delar Date(140102), fysisk plats där transaktionen äger rum (entityID), 4 platsnummer(9999).
- Enligt designen på ett enda datum på en enda fysisk plats kan det inte finnas fler än 9999 transaktioner -- Min lösning kommer också att innehålla samma begränsning.
Några punkter på min lösning
- Siffran med fyra platser är kopplad till datumet, vilket betyder att för ett nytt datum börjar räkningen från 0000. För ExempelGI_140102_1_0001,GI_140102_1_0002,GI_140102_1_0003,GI_1401003, GI_140103_0_01_01_01_03, GI_140103, GI_140103, 0_01_01, 01_03, GI_140103
Hur som helst kommer detta fält att vara unikt.
- Lösningen jämför det senaste datumet i posten med det aktuella datumet. Logiken:Om det aktuella datumet och det senaste datumet i posten stämmer överens, ökar den 4 platssiffror med värdet med 1Om det aktuella datumet och det senaste datumet i posten matchar inte Det ställer in siffran med fyra platser med värdet 0000.
Lösningen:(Koden nedan anger värdet som blir nästa GoodsInwardId, använd det enligt krav för att passa in 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 för att skapa den nödvändiga strukturen (Probable Guess)
För bordet:
CREATE TABLE [dbo].[SC_TD_GoodsInward](
[EntityId] [int] NULL,
[GoodsInwardId] [nvarchar](30) NULL
)
Exempelposter för 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 är en trolig lösning i din situation även om den perfekta lösningen skulle vara att ha identitetskolumn (använd reseed vid behov) och koppla den till det aktuella datumet som en beräknad kolumn.