Способ получения идентификатора вставленной строки - с помощью функции 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), но это должно помочь вам правильно трек.