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

Incremento dei valori delle chiavi primarie personalizzate in SQL

Prima di dare una soluzione alla domanda, alcuni punti sulla tua domanda:

  1. Poiché la chiave primaria personalizzata è composta principalmente da tre parti:data (140102), posizione fisica in cui avviene la transazione (ID entità), numero di 4 posizioni (9999).
  2. Secondo il progetto in una singola data in un unico luogo fisico, non possono esserci più di 9999 transazioni:anche My Solution conterrà la stessa limitazione.

Alcuni punti sulla mia soluzione

  1. La cifra a 4 cifre è legata alla data, il che significa che per una nuova data il conteggio inizia da 0000. Ad esempioGI_140102_1_0001,GI_140102_1_0002,GI_140102_1_0003,GI_140103_1_0000,GI_140104_1_0000

In ogni caso, questo campo sarà unico.

  1. La soluzione confronta l'ultima data nel record con la data corrente. La logica:se la data corrente e l'ultima data nel record corrispondono, quindi incrementa di 4 cifre del valore di 1 se la data corrente e l'ultima data nel record non corrisponde a imposta la cifra a 4 cifre con il valore 0000.

La soluzione:(sotto il codice viene indicato il valore che sarà il prossimo GoodsInwardId, utilizzalo secondo i requisiti per adattarsi alla tua soluzione)

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 per creare la struttura richiesta (Probable Guess)

Per la tavola:

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

Record di esempio per la tabella:

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

**È una soluzione probabile nella tua situazione, anche se la soluzione perfetta sarebbe quella di avere una colonna di identità (usare il reseed se necessario) e collegarla alla data corrente come colonna calcolata.