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

Zer*_*oth 4 c# sql-server autonumber

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

Gre*_*ech 8

获取插入行的标识的方法是使用该SCOPE_IDENTITY()函数.如果您正在使用存储过程,那么这将类似于以下内容将行标识作为输出参数返回.

CREATE PROCEDURE dbo.MyProcedure
(
    @RowId INT = NULL OUTPUT
)
AS

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

SET @RowId = SCOPE_IDENTITY();
Run Code Online (Sandbox Code Playgroud)

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

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

var sql = "INSERT INTO MyTable (Column1, Column2, ...) VALUES (@P1, @P2, ...);" +
          "SELECT SCOPE_IDENTITY();";
Run Code Online (Sandbox Code Playgroud)

然后,如果你使用你执行此操作,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, ...);";
Run Code Online (Sandbox Code Playgroud)

这可能不是完全正确的语法,你可能需要SET NOCOUNT ON;在开始时使用(我的头脑生锈,因为我很少使用动态SQL),但它应该让你走上正确的轨道.