Составной первичный ключ в табличной переменной в хранимой процедуре - PullRequest
41 голосов
/ 17 февраля 2012

Я новичок в хранимых процедурах и пытаюсь добавить составной первичный ключ к табличной переменной.

DECLARE @statistictemp TABLE (
    MajorName      VARCHAR(50) NOT NULL, 
    SubName       VARCHAR(50) NOT NULL, 
    DetailedName   VARCHAR(50) NOT NULL, 
    UniversityID   SMALLINT    NOT NULL, 
    StatisticValue DECIMAL(9,3)
);

ALTER TABLE @statistictemp 
ADD CONSTRAINT pk_statistictemp 
PRIMARY KEY (MajorName, SubName, DetailedName, UniversityID);

Я получаю сообщение об ошибке ALTER TABLE @statistictemp, говорящее

Incorrect syntax near '@statistictemp'. Expecting ID, QUOTED_ID, or '.'.

Что я здесь не так делаю? Как добавить составной первичный ключ в табличную переменную?

1 Ответ

83 голосов
/ 17 февраля 2012

Вы можете сделать это следующим образом:

DECLARE @statistictemp TABLE (
    MajorName       VARCHAR(50) NOT NULL, 
    SubName        VARCHAR(50) NOT NULL, 
    DetailedName    VARCHAR(50) NOT NULL, 
    UniversityID    SMALLINT NOT NULL, 
    StatisticValue  DECIMAL(9,3),
    PRIMARY KEY (MajorName, SubName, DetailedName, UniversityID)
);

Вы можете проверить, работает ли ограничение первичного ключа, попытавшись вставить дубликаты: например,

INSERT INTO @statistictemp(MajorName, SubName, DetailedName, UniversityID) SELECT 'a','b','c',1
INSERT INTO @statistictemp(MajorName, SubName, DetailedName, UniversityID) SELECT 'a','b','c',1

Второе выражение будет выбрасыватьошибка:

Сообщение 2627, уровень 14, состояние 1, строка 13
Нарушение ограничения PRIMARY KEY 'PK_ # 1EA48E8 _B595483D208CD6FA'.Невозможно вставить повторяющийся ключ в объект 'dbo. @ Statisticstemp'.
Оператор завершен.

...