首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从MS SQL Server获取自动编号主键

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

Stack Overflow用户
提问于 2008-11-25 00:19:32
回答 3查看 16.1K关注 0票数 4

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-11-25 00:27:33

获取插入行的标识的方法是使用SCOPE_IDENTITY()函数。如果您使用的是存储过程,则返回行标识作为输出参数的代码如下所示。

代码语言:javascript
运行
复制
CREATE PROCEDURE dbo.MyProcedure
(
    @RowId INT = NULL OUTPUT
)
AS

INSERT INTO MyTable
(
    Column1
    ,Column2
    ,...
)
VALUES
(
    @Param1
    ,@Param2
    ,...
);

SET @RowId = SCOPE_IDENTITY();

然后,您可以在任何后续插入中使用此值(或者,如果您可以将所有数据都传递到存储过程中,则可以在过程主体的其余部分中使用它)。

如果你动态地传递SQL,那么你可以使用几乎相同的技术,但是使用一个带有语句分隔符的字符串(在SQL中也是; ),例如:

代码语言:javascript
运行
复制
var sql = "INSERT INTO MyTable (Column1, Column2, ...) VALUES (@P1, @P2, ...);" +
          "SELECT SCOPE_IDENTITY();";

然后,如果您使用ExecuteScalar执行此操作,您将能够将标识作为标量结果返回并将其转换为正确的类型。或者,您可以一次性构建整个批次,例如

代码语言:javascript
运行
复制
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),但它应该会让您走上正确的道路。

票数 8
EN

Stack Overflow用户

发布于 2008-11-25 00:24:45

最好的方法是使用TSQL中的SCOPE_IDENTITY()函数。这应该作为插入的一部分来执行,即

代码语言:javascript
运行
复制
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()赋值给要在后续语句中使用的变量。例如:

代码语言:javascript
运行
复制
DECLARE @T1 int

INSERT INTO T (Name) VALUES('Test')

SELECT @T1 = SCOPE_IDENTITY() 

INSERT INTO T2 (Name, TId) VALUES('Test', @T1)
票数 4
EN

Stack Overflow用户

发布于 2008-11-25 00:31:21

如果您只是使用SQL,那么请检查Duncan的答案。但是,如果您使用的是LINQ,那么您可以创建实体,将其保存到数据库中,ID参数将自动填充。

给定一个用户实体和一个用户表,它可能如下所示:

代码语言:javascript
运行
复制
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 */
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/315963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档