Вставить из временной таблицы в таблицу со столбцом идентификаторов

Я беру несколько строк из таблицы, манипулирую ими во временной таблице, а затем пытаюсь вставить их как новые строки в исходную таблицу.

Однако я сталкиваюсь с проблемой со столбцом идентификаторов, даже если у меня нет столбца идентификаторов в моей временной таблице. Столбец идентификатора - это автоматически увеличивающееся число int.

Это кажется мне простой вещью, которую я слишком много думаю.

select top 0 *
into #TestTable
from OriginalTable;

...
--insert and manipulate records
...

ALTER TABLE #TestTable
DROP COLUMN MyIdentityColumn;

DECLARE @InsertedRows TABLE (NewSeqNum INT);

INSERT INTO OriginalTable
OUTPUT MyIdentityColumn INTO @InsertedRows(NewSeqNum)
SELECT * FROM #TestTable

но я получаю эту ошибку:

Явное значение для столбца идентификаторов в таблице «OriginalTable» можно указать только тогда, когда используется список столбцов и для IDENTITY_INSERT установлено значение ON.

Я абсолютно не хочу устанавливать явное значение, я хочу, чтобы оно было вставлено и предоставлено мне новое удостоверение (через @InsertedRows)


person Randy Hall    schedule 21.03.2017    source источник
comment
Не используйте select * в качестве значений. Вам необходимо явно указать столбцы. В вашем случае это не удается, потому что парсер не оценивает каждый шаг логически. Он все еще думает, что MyIdentityColumn является столбцом #TestTable, и думает, что вы пытаетесь вставить его. Будьте ясны в своем коде. Укажите столбцы в операторе вставки И в операторе выбора, который вы используете для значений.   -  person Sean Lange    schedule 21.03.2017
comment
@SeanLange есть ли динамический способ сделать это? Могу ли я выбрать имена столбцов из схемы без столбца идентификатора и использовать их вместо *, или я буквально застрял в списке их всех?   -  person Randy Hall    schedule 21.03.2017
comment
Вы должны ВСЕГДА перечислять столбцы. Если это большое количество столбцов, вы можете перетащить папку столбцов в SSMS в окно запроса. Все, кроме явно указанного столбца, является ленивым и склонным к ошибкам в будущем при изменении таблицы.   -  person Sean Lange    schedule 21.03.2017
comment
@RandyHall Еще один совет, помимо советов Шона Ланге: если вы объединяете много таблиц, вы можете добавить короткий псевдоним таблицы (FROM MYTABLE AS M), а затем, как только вы напишете точку после имени псевдонима, intellisense покажет список доступных столбцы, которые можно вставить, используя стрелку для выбора + клавиша ввода   -  person Oscar    schedule 22.03.2017


Ответы (2)


Если вы не хотите сохранять идентификатор вставленных записей, вам необходимо указать все столбцы, кроме столбца идентификатора в select. Как правило, не выбирайте *, всегда указывайте столбцы, которые вы хотите получить-вставить.

INSERT INTO OriginalTable (col1, col2, col3...)
OUTPUT MyIdentityColumn INTO @InsertedRows(NewSeqNum)
SELECT (col1, col2, col3...) FROM #TestTable
person Oscar    schedule 21.03.2017

Если я вас понимаю, я думаю, ваша проблема в том, что вы пытаетесь вставить "*" в исходную таблицу, что означает все столбцы из временной таблицы. Включая столбец идентификатора (который вы не хотите вставлять, потому что хотите, чтобы он создавался автоматически).

Вместо этого я бы предложил сделать что-то вроде этого:

Select [ColumnB],[ColumnC],[ColumnD],[Etc] into your temp table

Select [ColumnB],[ColumnC],[ColumnD],[Etc] into your original table.

... иначе, укажите столбцы явно и опустите столбец Identity.

person Kevin    schedule 21.03.2017