Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. MBelly является правильным на деньгах - Но тогда триггер будет всегда пытаться обновить таблицу B, даже если это не потребовало (Поскольку Вы также вставляете от таблицы C?).
Darren также корректен здесь, Вы не можете вернуть несколько идентификационных данных в результате набор. Ваши опции используют курсор и берут идентификационные данные для каждой строки, которую Вы вставляете, или подход Darren использования хранения идентификационных данных прежде и после. Пока Вы знаете инкремент идентификационных данных, это должно работать, пока Вы удостоверяетесь, что таблица заблокирована для всех трех событий.
, Если бы это был я, и это не было строго ограничено во времени, я пошел бы с курсором.
Используйте ouput пункт с 2005:
DECLARE @output TABLE (id int)
Insert into A (fname, lname)
OUTPUT inserted.ID INTO @output
SELECT fname, lname FROM B
select * from @output
теперь Ваша табличная переменная имеет значения идентификационных данных всех строк, которые Вы вставляете.
Читая Ваш вопрос тщательно, Вы просто хотите обновить таблицу B на основе новых значений идентификационных данных в таблице A.
После того, как вставка закончена, просто выполните обновление...
UPDATE B
SET NewID = A.ID
FROM B INNER JOIN A
ON (B.FName = A.Fname AND B.LName = A.LName)
Это предполагает, что FName / комбинация LName может привыкнуть к соответствию ключа записи между таблицами. Если дело обстоит не так, Вы, возможно, должны добавить дополнительные поля, чтобы гарантировать, чтобы записи соответствовали правильно.
, Если у Вас нет альтернативного ключа, который позволяет Вам соответствовать записям тогда, это не имеет смысла вообще, так как записи в таблице B нельзя отличить друг от друга.
Если Вы всегда хотите это поведение, Вы могли бы поместить ПОСЛЕ ТОГО, КАК ВСТАВЛЯЮТ, включают TableA, который обновит таблицу B.
Можно добраться путем присоединения на номер строки . Это возможно, потому что, так как это - идентификационные данные, это просто увеличит, поскольку Вы добавляете объекты, которые будут в порядке, что Вы выбираете их.
Я предлагаю использовать тип uniqueidentifier вместо идентификационных данных. Я этот случай можно генерировать идентификаторы перед вставкой:
update B set NewID = NEWID()
insert into A(fname,lname,id) select fname,lname,NewID from B
Насколько я понимаю его проблема, которую Вы имеете, то, что Вы хотите ВСТАВИТЬ в Таблицу A, которая имеет столбец идентификационных данных, и Вы хотите сохранить идентификационные данные от Таблицы B, которая не делает.
, Чтобы сделать это, Вам придется просто включить идентификационные данные, вставляют на таблице A. Это позволит Вам определять свой идентификатор на вставке и, пока они не конфликтуют, необходимо быть в порядке. Тогда можно просто сделать:
Insert into A(identity, fname, lname) SELECT newid, fname, lname FROM B
Не уверенный, какой DB Вы используете, но для SQL-сервера, которым была бы команда для включения вставки идентификационных данных:
set identity_insert A on