【发布时间】:2011-02-04 20:33:15
【问题描述】:
我正在执行 SQL 插入来填充我的表。我在一个表中有一个唯一生成的 ID,我想在另一个表中使用它来进行联接。这可能吗?
.NET MVC --
using (SqlConnection connect = new SqlConnection(connections))
{
SqlCommand command = new SqlCommand("ContactInfo_Add", connect);
command.Parameters.Add(new SqlParameter("name", name));
command.Parameters.Add(new SqlParameter("address", address));
command.Parameters.Add(new SqlParameter("Product", name));
command.Parameters.Add(new SqlParameter("Quantity", address));
command.Parameters.Add(new SqlParameter("DueDate", city));
connect.Open();
command.ExecuteNonQuery();
}
SQL 服务器 --
ALTER PROCEDURE [dbo].[Contact_Add]
@name varchar(40),
@address varchar(60),
@Product varchar(40),
@Quantity varchar(5),
@DueDate datetime
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO DBO.PERSON
(Name, Address) VALUES (@name, @address)
INSERT INTO DBO.PRODUCT_DATA
(PersonID, Product, Quantity, DueDate) VALUES (@Product, @Quantity, @DueDate)
END
代码插入正常。我该如何提取自动生成的 PersonID 以在 PRODUCT_DATA 中使用?
【问题讨论】:
-
user54197 查看 KM 的回答和我对此的评论。如果有人在不知不觉中更改了您的存储过程,则使用 Scope Identity 返回 PersonID 存在一些潜在问题。
-
@msarchet:想详细说明这些潜在问题是什么?当然,如果有人在不知道它是如何工作的情况下更改它,他们可能会破坏您的存储过程,但这与
SCOPE_IDENTITY本身无关 - 他们很可能会破坏OUTPUT INSERTED子句。 -
正如您刚才所说,这不是 SCOPE_IDENTITY 本身的问题,效果很好。使用插入的输出更加确定,因为如果有人更改存储过程的顺序,它不会中断。这并不完美,因为显然有人总是会破坏您的 SP,无论您如何返回值。使用像
@variable int output这样的参数是获取输出的最明显方法。但是仍然有人可以打破它,但这仍然更难。 -
在我使用 SQL Server 的所有时间里(十年了,真遗憾!),我从未见过有人更改存储过程以获取错误的 scope_identity。我想这可能会发生,但通常我不会让任何不知道自己在做什么的人编写 proc。但是,如果您拥有较新版本的 SQl Server,则输出子句是更好的选择,原因有很多,包括您可以返回一个不是通过标识生成的值,甚至可以返回一个以上的值。
标签: sql mysql sql-server stored-procedures