Как получить идентификатор столбца идентификации? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть отношение многие ко многим между двумя таблицами, Users и Projects.

Таблица, которая соединяет эти две таблицы, называется ProjectsUsers.

Здесьописание таблиц и их взаимосвязей:

CREATE TABLE "Users"
(
    Email VARCHAR(320) COLLATE SQL_Latin1_General_CP1_CI_AS PRIMARY KEY CHECK(LEN(Email) >= 3),
    --More....
);

CREATE TABLE "Projects"
(
    ProjectID INT PRIMARY KEY IDENTITY,
    --More....
);

CREATE TABLE "ProjectsUsers"
(
    UsersEmail VARCHAR(320) COLLATE SQL_Latin1_General_CP1_CI_AS CHECK(LEN(UsersEmail) >= 3) NOT NULL,
    ProjectsID INT NOT NULL,

    CONSTRAINT ProjectsUsers_PK PRIMARY KEY (UsersEmail, ProjectsID),
    CONSTRAINT ProjectsID_FK FOREIGN KEY (ProjectsID) REFERENCES Projects (ProjectID)  
               ON DELETE CASCADE ON UPDATE CASCADE ,
    CONSTRAINT UsersEmail_FK FOREIGN KEY (UsersEmail) REFERENCES Users(Email) 
               ON DELETE CASCADE ON UPDATE CASCADE
);

Я сейчас пытаюсь создать хранимую процедуру, которая будет вставлять новый проект в таблицу Projects. После добавления проекта я хочу создать ссылку на него в таблице ProjectsUsers. Проблема в том, что у меня нет никакого способа узнать, какой идентификатор проекта я только что создал - таким образом, я не могу знать, какой идентификатор мне нужно вставить в ProjectsUsers.

Так что, если мойхранимая процедура была примерно такой:

INSERT INTO Projects (Project, CreationDate, ProjectName) 
VALUES (@project,  GETDATE(), @email);

INSERT INTO ProjectsUsers VALUES (@email, ???)

Как я могу получить идентификатор?

Ответы [ 3 ]

0 голосов
/ 08 ноября 2019

Просто используйте SCOPE_IDENTITY следующим образом:

INSERT INTO Projects (Project, CreationDate, ProjectName) 
VALUES (@project, SYSDATETIME(), @email);

DECLARE @ProjectID INT = SCOPE_IDENTITY();

INSERT INTO ProjectsUsers 
VALUES (@email, @ProjectID)

Подробнее все соответствующие сведения о SCOPE_IDENTITY на официальном сайте документации Microsoft.

0 голосов
/ 08 ноября 2019

Используйте предложение OUTPUT! Не используйте различные идентификационные функции или переменные. Это напрямую решает вашу проблему:

DECLARE @ids TABLE (ProjectId int);
INSERT INTO Projects (Project, CreationDate, ProjectName) 
    OUTPUT inserted.ProjectId INTO @ids;
    VALUES (@project,  GETDATE(), @email);

INSERT INTO ProjectsUsers (UsersEmail, ProjectId)
    SELECT @email, ProjectId
    FROM @ids; 

Все остальные методы возврата идентичности имеют особенности:

  • Возможно, они не работают, когда в insert есть несколько операторов.
  • Возможно, одновременные вставки портят значение.
  • Возможно, они не работают с триггерами.
0 голосов
/ 08 ноября 2019
  1. Как упоминает Шон Ланге, вы можете использовать SCOPE_IDENTITY , чтобы получить последний идентификатор, вставленный из вашего процесса

  2. Вы также можете использовать OUTPUT и получите, возможно, много идентификаторов. Вы можете выводить на экран или в таблицу, но это не будет работать, если вы выбираете из таблицы, которая имеет триггеры.

...