VB.Net INSERT使用交易&重新使用Last INSERTED ID

时间:2014-08-06 07:40:05

标签: sql sql-server vb.net

我试图在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,但没有说明如何将该值重新用于另一个插入语句。

3 个答案:

答案 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并在第二个插入中使用它,而不会将带有输出参数的内容复制回客户端。此外,您的数据库将扩展得更好,因为它将使交易持续时间尽可能短。