是否可以使用两个insert语句创建存储过程,其中第一个insert语句中的id / primary_key将在第二个中使用?

时间:2011-09-14 18:20:02

标签: sql sql-server stored-procedures

我看到有一个非常类似的问题已经回答了讨论同样的问题,但我似乎无法理解它。下面是我的代码在存储过程中的副本。我需要以某种方式,让第二个insert语句将第一个生成的CompanyID插入到第二个Statement中。我感谢任何帮助。

谢谢!!

@comp_name nvarchar (50),
@City nvarchar (50),
@State nvarchar (10),
@Address ntext,
@Zip_Code nvarchar (50),
@Country nvarchar (50),
@cust_name nvarchar (50),
@CompanyID int
AS
INSERT INTO Company_Listing
(comp_name, City, State, Address, Zip_Code, Country)
VALUES (@comp_name, @City, @State, @Address, @Zip_Code, @Country)

INSERT INTO Customer_Listing
(cust_name, City, State, Address, Zip_Code, Country, CompanyID)
VALUES (@comp_name,@City,@State,@Address,@Zip_Code,@Country,@CompanyID)

5 个答案:

答案 0 :(得分:9)

假设这是针对SQL Server的 - 是的,请使用SCOPE_IDENTITY

@comp_name nvarchar (50),
@City nvarchar (50),
@State nvarchar (10),
@Address ntext,
@Zip_Code nvarchar (50),
@Country nvarchar (50),
@cust_name nvarchar (50),
@CompanyID int
AS
INSERT INTO Company_Listing
(comp_name, City, State, Address, Zip_Code, Country)
VALUES (@comp_name, @City, @State, @Address, @Zip_Code, @Country)

INSERT INTO Customer_Listing
(cust_name, City, State, Address, Zip_Code, Country, CompanyId)
VALUES (@comp_name,@City,@State,@Address,@Zip_Code,@Country,SCOPE_IDENTITY())

来自MSDN关于SCOPE_IDENTITY()的文档:

  

返回插入标识列的最后一个标识值   相同的范围。范围是一个模块:存储过程,触发器,   功能或批处理。因此,如果两个语句属于同一范围   它们处于相同的存储过程,功能或批处理中。

答案 1 :(得分:4)

是。假设您正在使用SQL Server ...只需使用SCOPE_IDENTITY()函数来检索最后插入的标识值。换句话说,将@CompanyID替换为SCOPE_IDENTITY()。

答案 2 :(得分:0)

SET @MyFirstID = (SELECT SCOPE_IDENTITY())

- 现在你有第一个插入语句的ID,即@MyFirstID

代码变为:

@comp_name nvarchar (50),
@City nvarchar (50),
@State nvarchar (10),
@Address ntext,
@Zip_Code nvarchar (50),
@Country nvarchar (50),
@cust_name nvarchar (50),
@CompanyID int
AS
INSERT INTO Company_Listing
(comp_name, City, State, Address, Zip_Code, Country)
VALUES (@comp_name, @City, @State, @Address, @Zip_Code, @Country)

INSERT INTO Customer_Listing
(cust_name, City, State, Address, Zip_Code, Country, CompanyID)
VALUES (@comp_name,@City,@State,@Address,@Zip_Code,@Country,SCOPE_IDENTITY())

答案 3 :(得分:0)

在第一个ID之后选取已创建记录的ID。这在不同的数据库系统中以不同的方式完成。

对于Microsoft SQL Server:

set @CompanyId = scope_identity()

答案 4 :(得分:-1)

是。您只需要添加一个临时语句来收集ID,将其存储在变量中,然后在第二个语句中使用它。所以你需要添加像

这样的东西
SELECT IDENT_CURRENT('dbo.CompanyTable')