我目前正在使用C#,我需要在一个表中插入一条新记录,获取新的主键值,然后在插入多个记录时将其用作外键引用。数据库是MS SQL Server 2003.感谢所有帮助!
答案 0 :(得分:8)
获取插入行标识的方法是使用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;
(我的头脑很生疏,因为我很少使用动态SQL)但它应该让你在正确的轨道上。
答案 1 :(得分:4)
执行此操作的最佳方法是在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()分配给要在后续语句中使用的变量。 e.g。
DECLARE @T1 int
INSERT INTO T (Name) VALUES('Test')
SELECT @T1 = SCOPE_IDENTITY()
INSERT INTO T2 (Name, TId) VALUES('Test', @T1)
答案 2 :(得分:3)
如果您只是使用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 */
}