如何获取身份列的ID?

我在两个表UsersProjects之间有多对多关系。

将这两个表连接在一起的表称为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表中创建对此项目的引用。问题是,我无法知道我刚创建的项目的ID,因此无法知道应该在ProjectsUsers中插入什么ID。

因此,如果我的存储过程是这样的:

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

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

如何获取ID?

flb1492 回答:如何获取身份列的ID?

  1. 正如肖恩·兰格(Sean Lange)所述,您可以使用SCOPE_IDENTITY来获取proc中插入的最后一个ID

  2. 您还可以使用OUTPUT子句,并获得许多ID。您可以在屏幕或表格中输出,但是如果您从具有触发器的表格中进行选择,则无法使用。

,

只需像这样使用SCOPE_IDENTITY

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

DECLARE @ProjectID INT = SCOPE_IDENTITY();

INSERT INTO ProjectsUsers 
VALUES (@email,@ProjectID)

Microsoft官方文档网站上的更多all the relevant details about SCOPE_IDENTITY

,

使用OUTPUT子句!不要使用各种标识函数或变量。这可以直接解决您的问题:

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

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

其他所有返回身份的方法都具有特殊性:

  • insert有多个语句时,它们可能不起作用。
  • 也许并发插入会弄乱值。
  • 也许它们不能与触发器配合良好。
本文链接:https://www.f2er.com/3135536.html

大家都在问