Je suis d'accord avec Sean - ajoutez une colonne d'identité, puis utilisez simplement une colonne calculée pour l'ID de tâche. Même si j'ai répondu à une question très semblable à celle-ci ici, je ne suis pas sûr de marquer celle-ci comme un doublon. La raison en est que vous souhaitez utiliser le task_id
en tant que partie de la clé primaire.
Cependant, je ne suis pas sûr que ce soit possible, car pour inclure une colonne calculée dans la clé primaire, elle doit être persisted
, et pour une raison quelconque (je pense que c'est à cause de l'utilisation d'un UDF), SQL Server ne me permettra pas de le marquer comme persistant.
Quoi qu'il en soit, voici ma solution proposée pour cela :
Tout d'abord, créez une fonction qui calculera l'identifiant de la tâche :
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
Ensuite, créez la table avec l'identifiant de la tâche sous forme de colonne calculée :
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
Maintenant, testez-le :
INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)
SELECT *
FROM Tasks
Résultats :
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
Vous pouvez voir une démo en direct sur rextester.