Как вставить запись и возвратить недавно созданный идентификатор с помощью единственного SqlCommand?

Часто используется термин «переполнение стека» (переполнение), но неправильное обозначение; атаки не переполняют стек, а буферы в стеке.

- из слайдов слайдов Prof. Доктор Дитер Голманн

48
задан Milen A. Radev 1 December 2008 в 13:39
поделиться

8 ответов

INSERT INTO YourTable(val1, val2, val3 ...) 
VALUES(@val1, @val2, @val3...);
SELECT SCOPE_IDENTITY();

не забывают точки с запятой в конце каждого оператора.

74
ответ дан Adrian Carneiro 7 November 2019 в 22:13
поделиться

Добавьте следующую строку до конца запроса SQL...

SELECT SCOPE_IDENTITY()

И затем используют метод ExecuteScalar на объекте SqlCommand...

var rowCount = command.ExecuteScalar()
25
ответ дан Andy McCluggage 7 November 2019 в 22:13
поделиться
insert into Yourtable()  
values()  
SELECT SCOPE_IDENTITY()

я просто запустил тест и проверил, что точки с запятой являются дополнительным SQL Server 2005 SP2 использования и.Net 3.5

16
ответ дан Adrian Carneiro 7 November 2019 в 22:13
поделиться

Добавьте выходной параметр к объекту команды и затем установите значение к новому идентификатору в хранимой процедуре.

Хранимая процедура:

@ID AS INT OUTPUT

[Insert Command]

SET @ID = SCOPE_IDENTITY()

.NET:

cmd.CommandText = "stored_procedure";

SqlParameter pID = new SqlParameter("ID", DBType.Int32, 4);

pID.Direction = ParameterDirection.Output;

cmd.ExecuteScalar();

int id = Convert.ToInt32(cmd.Parameters["ID"].Value.ToString());
5
ответ дан Adrian Carneiro 7 November 2019 в 22:13
поделиться

Не используйте @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ, однако простые, это может казаться. Это может возвратить неправильные значения.

SELECT SCOPE_IDENTITY()

, кажется, очевидный выбор.

2
ответ дан Kezzer 7 November 2019 в 22:13
поделиться

Сразу после Вашей вставки stmt, используйте

SELECT CAST(scope_identity() AS bigint) ---- incase you have a return result as int64

, Это возвратится, столбец создал идентификатор/идентификационные данные.

2
ответ дан Adrian Carneiro 7 November 2019 в 22:13
поделиться

Прямо из Джакузи :

при использовании SQL MS можно использовать "ВЫБОР @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ как Значение" после того, как вставка для получения последнего идентификатора генерировала

и:

@@IDENTITY и SCOPE_IDENTITY возвращают последнее значение идентификационных данных, сгенерированное в любой таблице на текущей сессии. Однако SCOPE_IDENTITY возвраты значение только в текущей области; @@IDENTITY не ограничен определенным объемом.

Редактирование: , Как указано в комментариях, необходимо всегда использовать SCOPE_IDENTITY, не @@IDENTITY.

1
ответ дан Treb 7 November 2019 в 22:13
поделиться

Хотя мне нравится Dave Markle ответ, (и я вижу, что Вы сделали также, так как Вы отметили его как свой ответ), тот метод может перестать работать, если Вы имеете, включает Вашу базу данных, тот контрольный CUD операции, и Ваша контрольная таблица имеет столбец IDENTITY. Это возвратило бы значение идентификационных данных таблицы Audit, не таблица Вы просто вставили в, так как контрольная таблица на самом деле происходит после.

В этом случае, больше общего метода может использоваться, который будет работать в обоих случаях, независимо от любого аудита. Это немного более многословно, но Вы получаете то, за что Вы платите.

пример:

@"DECLARE @tmp AS TABLE ( id int )
                    INSERT INTO case
                    (
                        caseID,
                        partID,
                        serialNumber,
                        hardware,
                        software,
                        firmware
                    )
                    OUTPUT Inserted.ID into @tmp
                    VALUES
                    (
                        @caseID,
                        @partItemID,
                        @serialNumber,
                        @hardware,
                        @software,
                        @firmware
                    )
                Select ID from @tmp" )
1
ответ дан Community 7 November 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: