Явное значение столбца идентификатора в таблице может быть указано только при использовании списка столбцов, а IDENTITY_INSERT - в SQL Server

Я пытаюсь выполнить этот запрос

INSERT INTO     dbo.tbl_A_archive
SELECT  *
FROM        SERVER0031.DB.dbo.tbl_A

но даже после того, как я запустил

set identity_insert dbo.tbl_A_archive on

Я получаю это сообщение об ошибке

Явное значение для столбца идентификации в таблице "dbo.tbl_A_archive" может быть указано только при использовании списка столбцов, а IDENTITY_INSERT включен.

tbl_A - это огромная таблица в строках и ширине, то есть она содержит много столбцов. Я не хочу вводить все столбцы вручную. Как я могу заставить это работать? Пожалуйста, помогите!

4b9b3361

Ну, сообщение об ошибке в основном говорит все. У вас есть следующие возможности:

  • Создайте список столбцов (SELECT на INFORMATION_SCHEMA.COLUMNS и хороший текстовый редактор или решения, предложенные Andomar и Dave, могут помочь вам в этом)

ИЛИ

  • введите столбец идентификатора в tbl_A_archive регулярный (не идентичный) int столбец (так как это таблица архива, для чего вам нужен столбец идентификатора?).
52
ответ дан 05 янв. '10 в 13:48
источник
SET IDENTITY_INSERT tableA ON

Вам нужно сделать список столбцов для инструкции INSERT:

INSERT Into tableA ([id], [c2], [c3], [c4], [c5] ) 
SELECT [id], [c2], [c3], [c4], [c5] FROM tableB

не нравится "INSERT Inta tableA SELECT........"

SET IDENTITY_INSERT tableA OFF
209
ответ дан 23 авг. '12 в 13:39
источник

Если вы используете SQL Server Management Studio, вам не нужно вводить список столбцов самостоятельно - просто щелкните таблицу в обозревателе объектов правой кнопкой мыши и выберите Script Таблица как ВЫБРАТЬ в Окно редактора новых запросов.

Если вы этого не сделаете, то в качестве отправной точки должен помочь запрос, похожий на этот:

SELECT SUBSTRING(
    (SELECT ', ' + QUOTENAME(COLUMN_NAME)
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = 'tbl_A'
        ORDER BY ORDINAL_POSITION
        FOR XML path('')),
    3,
    200000);
28
ответ дан 05 янв. '10 в 13:51
источник

Согласитесь с ответом Хайнци. Для параметра "Первая секунда" здесь возникает запрос, который генерирует список столбцов в таблице, разделенный запятыми:

select name + ', ' as [text()] 
from sys.columns 
where object_id = object_id('YourTable') 
for xml path('')

Для больших таблиц это может сэкономить много печатной работы:)

12
ответ дан 05 янв. '10 в 14:00
источник

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

В качестве альтернативы вы можете разрешить и вставки идентификатора запрета для таблицы со следующим утверждением

SET IDENTITY_INSERT tbl_A_archive ON
--Your inserts here
SET IDENTITY_INSERT tbl_A_archive OFF

Наконец, если вам нужно, чтобы столбец идентификатора работал, как есть, вы всегда можете просто запустить сохраненный процесс.

sp_columns tbl_A_archive 

Это вернет вам все столбцы из таблицы, которые вы затем можете вырезать и вставить в свой запрос. (Это почти ВСЕГДА лучше, чем использование *)

9
ответ дан 05 янв. '10 в 13:51
источник

Оба будут работать, но если вы все еще. Если вы получите ошибку, используя # 1, перейдите к # 2

1)

SET IDENTITY_INSERT customers ON
GO
insert into dbo.tbl_A_archive(id, ...)
SELECT Id, ...
FROM SERVER0031.DB.dbo.tbl_A

2)

SET IDENTITY_INSERT customers ON
GO
insert into dbo.tbl_A_archive(id, ...)
VALUES(@Id,....)

Добрый день.

2
ответ дан 30 марта '16 в 15:49
источник

Для оператора SQL вам также необходимо указать список столбцов. Например,

INSERT INTO tbl (idcol1,col2) VALUES ( value1,value2)

вместо

INSERT INTO tbl VALUES ( value1,value2)
1
ответ дан 16 дек. '17 в 22:01
источник

Вам нужно указать имя столбца, которое вы хотите вставить, если есть столбец Identity. Таким образом, команда будет выглядеть следующим образом:

SET IDENTITY_INSERT DuplicateTable ON

INSERT Into DuplicateTable ([IdentityColumn], [Column2], [Column3], [Column4] ) 
SELECT [IdentityColumn], [Column2], [Column3], [Column4] FROM MainTable

SET IDENTITY_INSERT DuplicateTable OFF

Если ваша таблица имеет много столбцов, введите имя столбца с помощью этой команды.

SELECT column_name + ','
FROM   information_schema.columns 
WHERE  table_name = 'TableName'
for xml path('')

(после удаления последней запятой (',')) Просто скопируйте имя столбца.

1
ответ дан 08 сент. '17 в 7:53
источник

Чтобы заполнить все имена столбцов в список с разделителями-запятыми для оператора Select для решений, упомянутых для этого вопроса, я использую следующие параметры, поскольку они немного менее подробные, чем Andomar's. Однако Андомар все же вполне приемлем.

1)

SELECT column_name + ',' 
FROM   information_schema.columns 
WHERE  table_name = 'YourTable'

2) Это, вероятно, самый простой способ создания столбцов, если у вас есть SSMS SQL Server.

1) Перейдите в таблицу в Проводнике объектов и щелкните по значку + слева от имени таблицы или дважды щелкните имя таблицы, чтобы открыть список.

2) Перетащите подпапку столбца в основную область запроса, и она автоматически заполнит весь список столбцов.

1
ответ дан 31 марта '16 в 20:05
источник