Ik ben het eens met Sean - voeg een identiteitskolom toe en gebruik dan gewoon een berekende kolom voor de taak-ID. Hoewel ik hier een vraag heb beantwoord die erg op deze lijkt, weet ik niet zeker of ik deze als een duplicaat moet markeren. De reden hiervoor is dat je de task_id
. wilt gebruiken als onderdeel van de primaire sleutel.
Ik weet echter niet zeker of dat mogelijk is, omdat om een berekende kolom in de primaire sleutel op te nemen, deze persisted
, en om de een of andere reden (ik denk dat het komt door het gebruik van een UDF) laat SQL Server me niet toe om het als persistent te markeren.
Hoe dan ook, hier is mijn voorgestelde oplossing hiervoor:
Maak eerst een functie die de taak-ID berekent:
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
Maak vervolgens de tabel met de taak-ID als een berekende kolom:
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
Test het nu:
INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)
SELECT *
FROM Tasks
Resultaten:
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
Je kunt een live demo zien op rextester.