【发布时间】:2014-08-06 07:40:04
【问题描述】:
我正在尝试在 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,但没有说明如何将该值重新用于另一个插入语句。
【问题讨论】:
-
在这种情况下,由于您使用用户输入作为 Id,最佳实践可能是包含一个日期时间列作为 InputDate,可用于重复使用。否则,您将需要选择插入的值,例如
select User_id from .. where user_name = 'ABC' -
@GSerg 您建议使用单个 ExecuteNonQuery() 的线程上的答案,但我希望每个查询在事务中单独运行。
-
@GSerg 原因是因为我正在动态构建查询并且我不希望 @@params 混淆。
-
那么你应该阅读
ExecuteNonQueryvsExecuteScalar。
标签: sql sql-server vb.net