Estoy de acuerdo con Sean:agregue una columna de identidad y luego use una columna calculada para la identificación de la tarea. Aunque he respondido una pregunta muy parecida a esta aquí, no estoy seguro de marcar esta como un duplicado. El motivo de esto es que desea utilizar el task_id
como parte de la clave principal.
Sin embargo, no estoy seguro de que eso sea posible, ya que para incluir una columna calculada en la clave principal debe ser persisted
, y por alguna razón (creo que es por el uso de un UDF) SQL Server no me permitirá marcarlo como persistente.
De todos modos, aquí está mi solución propuesta para esto:
Primero, crea una función que calculará la identificación de la tarea:
CREATE FUNCTION dbo.GenerateTaskId
(
@Row_Id int,
@Issue_Id int,
@Issue_Sub_Id int
)
RETURNS Int
AS
BEGIN
RETURN
(
SELECT COUNT(*)
FROM dbo.Tasks
WHERE Issue_Id = @Issue_Id
AND Issue_Sub_ID = @Issue_Sub_ID
AND Row_Id <= @Row_Id
)
END
GO
Luego, cree la tabla con la identificación de la tarea como una columna calculada:
CREATE TABLE dbo.Tasks
(
Row_Id [int] IDENTITY(1,1),
Issue_ID [int] NOT NULL,
Issue_Sub_ID [int] NOT NULL,
Task_Id AS dbo.GenerateTaskId(Row_Id, Issue_Id, Issue_Sub_Id),
CONSTRAINT PK_Tasks PRIMARY KEY (Row_Id)
)
GO
Ahora, pruébalo:
INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)
SELECT *
FROM Tasks
Resultados:
Row_Id Issue_ID Issue_Sub_ID Task_Id
1 12345 1 1
2 12345 1 2
3 12345 1 3
4 12345 2 1
5 12345 2 2
6 67890 2 1
7 67890 2 2
8 67890 2 3
Puede ver una demostración en vivo en rextester.