我试图在VB.Net中使用SqlTransaction
来执行对两个表的插入,我想在第二个表的列中插入第一个表中的最后插入的ID。
我想使用OUTPUT INSERTED.ID
代替@SCOPE_IDENTITY()
。
以下是从SQL Server Profiler中提取的两个查询:
INSERT INTO USER(USER_NAME)
OUTPUT INSERTED.USER_ID
VALUES (@USER_NAME)
INSERT INTO USER_ADDRESS(USER_ID, USER_ADDRESS)
VALUES ('', GETDATE(), ''001'', @OPD_OVP_NO, @OPD_PAT_CODE, @OPD_DATE, @OPD_AMOUNT)
这是VB.Net代码:
Dim sqlTransaction As SqlTransaction= sqlConnection.BeginTransaction
Dim sqlCommand As New SqlCommand With {.Connection = sqlConnection}
sqlCommand.CommandText = "INSERT INTO USER(USER_NAME) OUTPUT INSERTED.USER_ID VALUES (@USER_NAME)"
sqlCommand.Parameters.AddWithValue("@USER_NAME", "ABC")
sqlCommand.Transaction = sqlTransaction
sqlCommand.ExecuteNonQuery()
sqlCommand.Parameters.Clear()
sqlCommand.CommandText = "INSERT INTO USER_ADDRESS(USER_ID,USER_ADDRESS)VALUES(@LASTID, @USER_ADDRESS)"
sqlCommand.Parameters.AddWithValue("@LASTID", LASTID)'//LAST ID should be from the previously inserted ID
sqlCommand.Parameters.AddWithValue("@USER_ADDRESS","AB Street")
sqlCommand.Transaction = sqlTransaction
sqlCommand.ExecuteNonQuery()
sqlTransaction.Commit()
我检查了其他线程但是它们只展示了如何从@SCOPE_IDENTITY()
或OUTPUT INSERTED.USER_ID
获取最后一个插入的ID,但没有说明如何将该值重新用于另一个插入语句。
答案 0 :(得分:3)
您无法直接将第一个insert语句的INSERTED.ID用于第二个语句。
首先应使用OUTPUT INTO将其存储在临时表中。
DECLARE @MyTableVar table(USER_ID int);
DECLARE @NewUserID int;
INSERT INTO USER(USER_NAME)
OUTPUT INSERTED.USER_ID INTO @MyTableVar
VALUES (@USER_NAME);
SET @NewUserID = (SELECT USER_ID FROM @MyTableVar);
INSERT INTO USER_ADDRESS(USER_ID, USER_ADDRESS)
VALUES(@NewUserID, @USER_ADDRESS);
答案 1 :(得分:2)
您可以编写一个执行两个插入的复合语句:
create table [User] (User_ID int identity(97,-1) not null,
User_Name varchar(19) not null)
create table User_Address (User_ID int not null,
User_Address varchar(22) not null)
declare @User_Name varchar(19)
declare @User_Address varchar(22)
select @User_Name = 'abc', @User_Address='def'
insert into User_Address (User_ID,User_Address)
select User_ID,@User_Address
from (
insert into [User] (User_Name)
output inserted.User_ID
select @User_Name
) t
select * from [User]
select * from User_Address
结果:
User_ID User_Name
----------- -------------------
97 abc
User_ID User_Address
----------- ----------------------
97 def
答案 2 :(得分:1)
此类事情的最佳方法是在SQL存储过程中执行事务,而不是使用客户端控制的事务。存储过程将能够访问使用第一个插入中的ID并在第二个插入中使用它,而不会将带有输出参数的内容复制回客户端。此外,您的数据库将扩展得更好,因为它将使交易持续时间尽可能短。