Sono d'accordo con Sean:aggiungi una colonna di identità, quindi usa semplicemente una colonna calcolata per l'ID attività. Anche se ho risposto a una domanda molto simile a questa qui, non sono sicuro di contrassegnarla come duplicata. Il motivo è che vuoi usare task_id
come parte della chiave primaria.
Tuttavia, non sono sicuro che sia possibile, poiché per includere una colonna calcolata nella chiave primaria deve essere persisted
, e per qualche motivo (penso sia dovuto all'uso di un UDF) SQL Server non mi consentirà di contrassegnarlo come persistente.
Comunque, ecco la mia soluzione proposta per questo:
Innanzitutto, crea una funzione che calcolerà l'ID attività:
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
Quindi, crea la tabella con l'ID attività come colonna calcolata:
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
Ora, provalo:
INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)
SELECT *
FROM Tasks
Risultati:
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
Puoi vedere una demo dal vivo su rextester.