从MS SQL Server获取自动编号主键

时间:2008-11-25 00:19:32

标签: c# sql-server autonumber

我目前正在使用C#,我需要在一个表中插入一条新记录,获取新的主键值,然后在插入多个记录时将其用作外键引用。数据库是MS SQL Server 2003.感谢所有帮助!

3 个答案:

答案 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 */
}