Вставить в... Выбрать *, как игнорировать личность?
У меня есть временная таблица с точной структурой конкретной таблицы Т. Она была создана следующим образом:
выберите top 0 * в #tmp из T
После обработки и заполнения содержимого в #tmp я хочу скопировать содержимое обратно в T следующим образом:
вставить в T выбрать * из #tmp
Это нормально, если T не имеет столбца идентификатора, но в моем случае это так. Есть ли в любом случае я могу игнорировать столбец идентификатора автоинкремента из #tmp при копировании в T? Моя мотивация заключается в том, чтобы не указывать имя каждого столбца в списке "Вставить в".
EDIT: toggling identity_insert не будет работать, потому что pkey в #tmp могут столкнуться с тегами в T, если строки были вставлены в T за пределами моего script, если #tmp автоматически увеличил значение pkey для синхронизации с T в первую очередь.
Ответы
Ответ 1
Так как идентификатор будет генерироваться во время вставки, вы могли бы просто удалить этот столбец из #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
Ответ 2
SET IDENTITY_INSERT ON
Команда INSERT
SET IDENTITY_INSERT OFF
Ответ 3
См. ответы здесь и здесь:
select * into without_id from with_id
union all
select * from with_id where 1 = 0
Причина:
Когда существующий столбец идентификации выбран в новую таблицу, новый столбец наследует свойство IDENTITY, если не выполняется одно из следующих условий:
- Оператор SELECT содержит предложение join, GROUP BY или агрегацию.
- Несколько операторов SELECT объединяются с помощью UNION.
- Столбец идентификатора указан более чем один раз в списке выбора.
- Столбец идентичности является частью выражения.
- Идентификационный столбец из удаленного источника данных.
Если какое-либо из этих условий истинно, столбец создается NOT NULL вместо наследования свойства IDENTITY. Если в новой таблице требуется столбец идентификатора, но такой столбец недоступен или вы хотите, чтобы значение семени или приращения, отличное от столбца идентификатора источника, определите столбец в списке выбора с помощью функции IDENTITY. См. "Создание столбца идентификации с помощью функции IDENTITY" в разделе "Примеры" ниже.
Все кредиты идут на Эрик Хамфри и bernd_k
Ответ 4
Не с SELECT *
- если вы выбрали каждый столбец, но личность, все будет в порядке. Единственный способ, который я вижу, это то, что вы можете сделать это, динамически создавая оператор INSERT
.
Ответ 5
Просто перечислите колоны, которые вы хотите повторно вставить, вы никогда не должны использовать select * в любом случае. Если вы не хотите вводить их, просто перетащите их из браузера объектов (если вы разворачиваете таблицу и перетаскиваете слово, столбцы, вы получите все из них, просто удалите столбец id)
Ответ 6
set identity_insert on
Используйте это.
Ответ 7
Возможно ли обновление, в котором работает T.ID = # tmp.ID?
Ответ 8
INSERT INTO #Table
SELECT MAX (Id) + ROW_NUMBER() OVER (ORDER BY Id)
Ответ 9
- это дает мне возможность просмотреть данные до того, как я вставлю
- У меня есть соединение между временными таблицами как часть моих вычислений; temp tables позволяет мне сосредоточиться на точных данных, с которыми я работаю. Я думаю, что да. Любые предложения/комментарии?
Для части 1, как упоминал Колтен в одном из комментариев, инкапсуляция ваших операторов в транзакцию и добавление параметра для переключения между отображением и фиксацией будет соответствовать вашим потребностям. Для части 2 мне нужно будет увидеть, какие "вычисления" вы пытаетесь сделать. Ограничение ваших данных на временную таблицу может быть осложнено.