Подтвердить что ты не робот

Вставить в... Выбрать *, как игнорировать личность?

У меня есть временная таблица с точной структурой конкретной таблицы Т. Она была создана следующим образом: выберите top 0 * в #tmp из T

После обработки и заполнения содержимого в #tmp я хочу скопировать содержимое обратно в T следующим образом: вставить в T выбрать * из #tmp

Это нормально, если T не имеет столбца идентификатора, но в моем случае это так. Есть ли в любом случае я могу игнорировать столбец идентификатора автоинкремента из #tmp при копировании в T? Моя мотивация заключается в том, чтобы не указывать имя каждого столбца в списке "Вставить в".

EDIT: toggling identity_insert не будет работать, потому что pkey в #tmp могут столкнуться с тегами в T, если строки были вставлены в T за пределами моего script, если #tmp автоматически увеличил значение pkey для синхронизации с T в первую очередь.

4b9b3361

Ответ 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 мне нужно будет увидеть, какие "вычисления" вы пытаетесь сделать. Ограничение ваших данных на временную таблицу может быть осложнено.