Поздний ответ, но вот альтернатива ответам SCOPE_IDENTITY()
, которые мы в итоге использовали: ВСТАВЛЕННЫЙ ВЫХОД
Возврат только IDвставленного объекта:
Позволяет получить все или некоторые атрибуты вставленной строки:
string insertUserSql = @"INSERT INTO dbo.[User](Username, Phone, Email)
OUTPUT INSERTED.[Id]
VALUES(@Username, @Phone, @Email);";
int newUserId = conn.QuerySingle<int>(insertUserSql,
new
{
Username = "lorem ipsum",
Phone = "555-123",
Email = "lorem ipsum"
}, tran);
Возвращать вставленный объект с идентификатором:
Если вы хотите, вы можете получить Phone
и Email
или даже весь вставленный ряд:
string insertUserSql = @"INSERT INTO dbo.[User](Username, Phone, Email)
OUTPUT INSERTED.*
VALUES(@Username, @Phone, @Email);";
User newUser = conn.QuerySingle<User>(insertUserSql,
new
{
Username = "lorem ipsum",
Phone = "555-123",
Email = "lorem ipsum"
}, tran);
Кроме того, вы можете вернуть данные удалено или обновлено строк.Просто будьте осторожны, если вы используете триггеры, потому что:
Столбцы, возвращаемые из OUTPUT, отражают данные в том виде, в каком они есть после выполнения оператора INSERT, UPDATE или DELETE, но до выполнения триггеров.
Для триггеров INSTEAD OF возвращаемые результаты генерируются так, как если бы фактически имели место INSERT, UPDATE или DELETE, даже если в результате операции триггера не было никаких изменений.Если в теле триггера используется оператор, включающий предложение OUTPUT, псевдонимы таблиц должны использоваться для ссылки на вставленные и удаленные таблицы триггера, чтобы избежать дублирования ссылок на столбцы с таблицами INSERTED и DELETED, связанными с OUTPUT.
Подробнее об этом в документации: ссылка