Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Поскольку идентификационные данные будут сгенерированы во время вставки так или иначе, Вы могли просто удалить этот столбец из #tmp прежде, чем вставить данные назад в T?
alter table #tmp drop column id
UPD: Вот пример, я протестировал в SQL Server 2008:
create table T(ID int identity(1,1) not null, Value nvarchar(50))
insert into T (Value) values (N'Hello T!')
select top 0 * into #tmp from T
alter table #tmp drop column ID
insert into #tmp (Value) values (N'Hello #tmp')
insert into T select * from #tmp
drop table #tmp
select * from T
drop table T
НАБОР IDENTITY_INSERT НА
команда
INSERT УСТАНОВИЛ IDENTITY_INSERT ПРОЧЬ
Не с SELECT *
- при выборе каждого столбца, но идентификационных данных он будет прекрасен. Единственным путем я вижу, то, что Вы могли сделать это путем динамичного создания INSERT
оператор.
Просто перечислите colums, который Вы хотите повторно вставить, Вы никогда не должны использовать выбор * так или иначе. Если Вы не захотите вводить их, просто перетащите их от обозревателя объектов (Если Вы развернете таблицу и перетащите слово, столбцы, то Вы получите всех их, просто удалите идентификационный столбец)
Мог бы "обновление где T.ID = #tmp. Идентификатор" работа?
- это дает мне шанс предварительно просмотреть данные, прежде чем я сделаю вставку
- , у меня есть соединения между временными таблицами как часть моего вычисления; временные таблицы позволяют мне фокусироваться на точных данных набора, с которыми я работаю. Я думаю, что это было этим. Какие-либо предложения/комментарии?
Для части 1, как упомянуто Kolten в одном из комментариев, инкапсулируя Ваши операторы в транзакции и добавляя параметр для переключения между дисплеем и фиксацией удовлетворит потребности. Для Части 2 я был бы потребности видеть, каких "вычислений" Вы делаете попытку. Ограничение Ваших данных к временной таблице может быть по усложнению ситуации.
INSERT INTO #Table SELECT MAX (Id) + ROW_NUMBER () OVER (ORDER BY Id)