sql >> Base de Datos >  >> RDS >> Sqlserver

Incremento de valores de clave principal personalizados en SQL

Antes de dar una solución a la pregunta, algunos puntos sobre su pregunta:

  1. Como la clave principal personalizada consta principalmente de tres partes Fecha (140102), ubicación física donde se lleva a cabo la transacción (entityID), 4 número de lugar (9999).
  2. De acuerdo con el diseño en una sola fecha en una sola ubicación física, no puede haber más de 9999 transacciones; My Solution también tendrá la misma limitación.

Algunos puntos en mi solución

  1. El dígito de 4 lugares está ligado a la fecha, lo que significa que para una nueva fecha, el conteo comienza desde 0000. Por ejemplo, GI_140102_1_0001, GI_140102_1_0002, GI_140102_1_0003, GI_140103_1_0000, GI_140104_1_0000

De cualquier forma, este campo será único.

  1. La solución compara la fecha más reciente en el registro con la fecha actual. La lógica:si la fecha actual y la fecha más reciente en el registro coinciden, entonces incrementa el dígito de 4 posiciones por el valor en 1 si la fecha actual y la fecha más reciente en el registro no coincideEl establece el dígito de 4 lugares por el valor 0000.

La solución:(El siguiente código proporciona el valor que será el próximo GoodsInwardId, utilícelo según los requisitos para adaptarse a su solución)

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 para crear la estructura requerida (Probable Guess)

Para la mesa:

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

Registros de muestra para la tabla:

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

** Es una solución probable en su situación, aunque la solución perfecta sería tener una columna de identidad (utilice la reinicialización si es necesario) y vincúlela con la fecha actual como una columna calculada.