Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Colonne de type identité mais basée sur des critères de regroupement

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.