Zgadzam się z Seanem - dodaj kolumnę tożsamości, a następnie użyj kolumny obliczonej dla identyfikatora zadania. Mimo że odpowiedziałem na pytanie bardzo podobne do tego tutaj, nie jestem pewien, czy oznaczę to jako duplikat. Powodem tego jest to, że chcesz użyć task_id
jako część klucza podstawowego.
Jednak nie jestem pewien, czy jest to możliwe, ponieważ aby dołączyć kolumnę obliczoną do klucza podstawowego, musi ona być persisted
, iz jakiegoś powodu (myślę, że jest to spowodowane użyciem UDF) SQL Server nie pozwoli mi oznaczyć go jako utrwalonego.
W każdym razie, oto moje proponowane rozwiązanie:
Najpierw utwórz funkcję, która obliczy identyfikator zadania:
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
Następnie utwórz tabelę z identyfikatorem zadania jako kolumną obliczeniową:
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
Teraz przetestuj:
INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)
SELECT *
FROM Tasks
Wyniki:
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
Możesz zobaczyć demo na żywo na rextesterze.