sql >> Databasteknik >  >> RDS >> Sqlserver

Inkrementera anpassade primära nyckelvärden i SQL

Innan du ger en lösning på frågan några punkter på din fråga:

  1. Den anpassade primärnyckeln består huvudsakligen av tre delar Date(140102), fysisk plats där transaktionen äger rum (entityID), 4 platsnummer(9999).
  2. 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

  1. 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.

  1. 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.



  1. Hitta skillnaden mellan två datum i PHP eller MySQL

  2. MySQL (Windows10) FULLTEXT-sökning med MyISAM-tabeller fungerar inte

  3. Fråga Välj grupp efter sista tecknet i fältet

  4. PostgreSQL:formatera intervall som minuter