我目前正在使用C#,我需要将一条新记录插入到一个表中,获得新的主键值,然后在插入多条记录时将其用作外键引用。数据库为MS SQL Server 2003。感谢所有的帮助!
发布于 2008-11-25 00:27:33
获取插入行的标识的方法是使用SCOPE_IDENTITY()
函数。如果您使用的是存储过程,则返回行标识作为输出参数的代码如下所示。
CREATE PROCEDURE dbo.MyProcedure
(
@RowId INT = NULL OUTPUT
)
AS
INSERT INTO MyTable
(
Column1
,Column2
,...
)
VALUES
(
@Param1
,@Param2
,...
);
SET @RowId = SCOPE_IDENTITY();
然后,您可以在任何后续插入中使用此值(或者,如果您可以将所有数据都传递到存储过程中,则可以在过程主体的其余部分中使用它)。
如果你动态地传递SQL,那么你可以使用几乎相同的技术,但是使用一个带有语句分隔符的字符串(在SQL中也是;
),例如:
var sql = "INSERT INTO MyTable (Column1, Column2, ...) VALUES (@P1, @P2, ...);" +
"SELECT SCOPE_IDENTITY();";
然后,如果您使用ExecuteScalar
执行此操作,您将能够将标识作为标量结果返回并将其转换为正确的类型。或者,您可以一次性构建整个批次,例如
var sql = "DECLARE @RowId INT;" +
"INSERT INTO MyTable (Column1, Column2, ...) VALUES (@P1, @P2, ...);" +
"SET @RowId = SCOPE_IDENTITY();" +
"INSERT INTO MyOtherTable (Column1, ...) VALUES (@P3, @P4, ...);";
这可能不是完全正确的语法,并且您可能需要在一开始就使用SET NOCOUNT ON;
(我的想法有点生疏,因为我很少使用dynamic SQL),但它应该会让您走上正确的道路。
发布于 2008-11-25 00:24:45
最好的方法是使用TSQL中的SCOPE_IDENTITY()函数。这应该作为插入的一部分来执行,即
SqlCommand cmd = new SqlCommand(@"
INSERT INTO T (Name) VALUES(@Name)
SELECT SCOPE_IDENTITY() As TheId", conn);
cmd.AddParameter("@Name", SqlDbType.VarChar, 50).Value = "Test";
int tId = (int)cmd.ExecuteScalar();
或者,您可以将SCOPE_IDENTITY()赋值给要在后续语句中使用的变量。例如:
DECLARE @T1 int
INSERT INTO T (Name) VALUES('Test')
SELECT @T1 = SCOPE_IDENTITY()
INSERT INTO T2 (Name, TId) VALUES('Test', @T1)
发布于 2008-11-25 00:31:21
如果您只是使用SQL,那么请检查Duncan的答案。但是,如果您使用的是LINQ,那么您可以创建实体,将其保存到数据库中,ID参数将自动填充。
给定一个用户实体和一个用户表,它可能如下所示:
using(var db = new DataContext()) {
var user = new User { Name = "Jhon" };
db.Users.InsertOnSubmit(user);
db.SubmitChanges();
/* At this point the user.ID field will have the primary key from the database */
}
https://stackoverflow.com/questions/315963
复制相似问题