Когда я вставляю в таблицы, используя вместо триггеров @@Identity
, IDENT_CURRENT('Table')
и SCOPE_IDENTITY()
возвращаю ноль. Как я могу получить последний идентификатор вставленной строки?
sql-server
sql-server-2008
t-sql
trigger
identity
Мехди Лотфи
источник
источник
inserted
но ни одна строка не вставлена , когдаINSTEAD OF
триггер триггерами.Ответы:
С триггером INSTEAD_OF это означает, что вставка еще не произошла. Вы не можете знать личность, так как она еще не была создана. Возможно получить значение из метаданных (
DBCC CHECKIDENT
), но полагаться на него не будет правильно при параллельном выполнении, и, кроме того, оно требует повышенных привилегий.Триггеры INSTEAD_OF крайне редко требуются и имеют серьезный запах кода. Вы уверены, что вам это нужно? Разве вы не можете работать с обычным триггером ПОСЛЕ?
источник
Вместо триггера вы определенно можете получить вставленное значение ... но только после того, как вы выполните вставку.
Результаты:
Теперь убери
Кроме того, вы никогда, никогда, никогда не должны использовать
@@IDENTITY
или вIDENT_CURRENT()
любом случае. ИSCOPE_IDENTITY
должно быть зарезервировано для ситуаций, когда вы знаете, что может быть вставлена только одна строка. Распространенное заблуждение в отношении триггеров заключается в том, что они запускаются для каждой строки, как и на других платформах, но в SQL Server они запускаются для каждой операции - поэтому многострочная вставка с использованиемVALUES(),(),()
илиINSERT...SELECT
- чтоSCOPE_IDENTITY
бы вы указали для своей переменной?источник
Основная проблема: Trigger и Entity Framework работают в разных сферах. Проблема в том, что если вы генерируете новое значение PK в триггере, это будет другой областью действия. Таким образом, эта команда возвращает ноль строк и EF сгенерирует исключение.
Решение состоит в том, чтобы добавить следующий оператор SELECT в конце вашего триггера:
вместо * вы можете указать все названия столбцов, включая
источник