Jeg er enig med Sean - tilføj en identitetskolonne, og brug derefter bare en beregnet kolonne til opgave-id'et. Selvom jeg har besvaret et spørgsmål meget som dette her, er jeg ikke sikker på, om jeg skal markere denne som en dublet. Grunden til dette er, at du vil bruge task_id
som en del af primærnøglen.
Jeg er dog ikke sikker på, at det er muligt, da for at inkludere en beregnet kolonne i primærnøglen skal den være persisted
, og af en eller anden grund (jeg tror, det er på grund af brugen af en UDF) vil SQL Server ikke tillade mig at markere den som vedvarende.
Her er i hvert fald min foreslåede løsning til dette:
Først skal du oprette en funktion, der beregner opgave-id'et:
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
Opret derefter tabellen med opgave-id'et som en beregnet kolonne:
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 det nu:
INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)
SELECT *
FROM Tasks
Resultater:
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
Du kan se en live demo på rextester.