2010-12-15 35 views
24

Je possède ce type utilisateur que je voudrais ajouter une clé primaire ou index:Comment ajouter un index ou une clé primaire à un type de table défini par l'utilisateur dans SQL Server?

IF NOT EXISTS (
    SELECT * 
    FROM sys.types st 
    JOIN sys.schemas ss 
    ON st.schema_id = ss.schema_id 
    WHERE st.name = N'DistCritGroupData' 
    AND ss.name = N'dbo') 
BEGIN 

    CREATE TYPE [dbo].[DistCritGroupData] AS TABLE 
    (
    [DistCritTypeId] [int] NOT NULL, 
    [ItemAction] [int] NOT NULL,   
    [ObjectId] [int] NOT NULL, 
    [OperatorType] [int] NOT NULL  
); 

END; 
GO 

Je voudrais essentiellement soit ajouter une clé primaire ou un index ordonné en clusters. J'ai essayé ceci mais j'obtiens l'erreur "Impossible de trouver l'objet" dbo.DistCritGroupData "parce qu'il n'existe pas ou que vous n'avez pas d'autorisations.

CREATE TYPE [dbo].[DistCritGroupData] AS TABLE 
    (
    [DistCritTypeId] [int] NOT NULL, 
    [ItemAction] [int] NOT NULL,   
    [ObjectId] [int] NOT NULL, 
    [OperatorType] [int] NOT NULL, 
    CONSTRAINT [DistCritGroupData0] PRIMARY KEY CLUSTERED 
    (
     [DistCritTypeId] ASC 
    )   
); 

Je vois dans l'Explorateur d'objets sur mon type de table défini par l'utilisateur qu'il ya des sections pour les « Colonnes », « Keys », « contraintes » et « Index ». Les questions sont: comment puis-je ajouter une clé ou un index?

Répondre

38

Pourquoi pas ça?

CREATE TYPE [dbo].[DistCritGroupData] AS TABLE 
    (
    [DistCritTypeId] [int] NOT NULL PRIMARY KEY CLUSTERED, 
    [ItemAction] [int] NOT NULL,   
    [ObjectId] [int] NOT NULL, 
    [OperatorType] [int] NOT NULL  
); 

ou

CREATE TYPE [dbo].[DistCritGroupData] AS TABLE 
    (
    [DistCritTypeId] [int] NOT NULL, 
    [ItemAction] [int] NOT NULL,   
    [ObjectId] [int] NOT NULL, 
    [OperatorType] [int] NOT NULL, 
    PRIMARY KEY CLUSTERED ([DistCritTypeId] ASC)   
); 

CREATE TYPE ne permet pas de nommer les contraintes. Comme les variables de table.

3

Vous pouvez spécifier votre type comme ceci:

CREATE TYPE [dbo].[DistCritGroupData] AS TABLE 
    (
    [DistCritTypeId] [int] NOT NULL primary key, 
    [ItemAction] [int] NOT NULL,   
    [ObjectId] [int] NOT NULL, 
    [OperatorType] [int] NOT NULL 
); 

Je ne ai jamais appris pourquoi les gens de la base de données ont besoin des noms pour les clés primaires. Ils devraient être appelés La clé primaire de la table xyz.

+1

La "clé primaire de la table xyz" est-elle un identifiant valide? Il a besoin d'un nom pour sys.objects .. – gbn

+0

@gbn Il est absolument unique et vous pouvez évaluer le nom généré unique à partir des tables système, si vous le devez. –

+2

Vous avez besoin d'une clé ou d'une contrainte nommée lorsque vous utilisez le contrôle de code source. Ensuite, les clés nommées ou les contraintes sont très utiles. – eghetto

15

Les réponses @bernd_K et @ gbn fonctionnent s'il s'agit d'une seule colonne PK. Pour plusieurs colonnes, il serait:

CREATE TYPE [dbo].[DistCritGroupData] AS TABLE 
    (
    [DistCritTypeId] [int] NOT NULL, 
    [ItemAction] [int] NOT NULL,   
    [ObjectId] [int] NOT NULL, 
    [OperatorType] [int] NOT NULL, 
    PRIMARY KEY (ColumnA,ColumnB) 
); 

En bref, vous pouvez avoir et UNIQUE table constraints PKs, mais vous ne pouvez pas les nommer. Cela a du sens, puisque vous allez créer plusieurs objets du même type, et la seule fois où vous voudrez travailler avec ces contraintes serait une altération de tout le type de table.

Vous ne pouvez pas non plus définir d'index, car ceux-ci sont principalement un artefact autour du stockage physique.