I have this user-defined type that I would like to add a primary key or index to:
IF NOT EXISTS (
SELECT *
FROM sys.types st
JOIN sys.schemas ss
ON
Why not this?
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
);
or
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 does not allow naming of contraints. Like table variables.
@bernd_K and @gbn's answers work if it's a single column PK. For multi column, it would be:
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)
);
In short, you can have PKs and UNIQUE table constraints, but you cannot name them. This kind of makes sense, since you're going to be creating multiple objects of the same type, and the only time you're going to want to work with these constraints would be an alteration of the entire table type.
You also cannot define indexes, since those are primarily an artifact around physical storage.