Явное значение для столбца идентификаторов в таблице можно указать только при использовании списка столбцов и вставке идентификаторов в 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 это огромная таблица в строках и ширине, т. е. она имеет много столбцов. Я не хочу вводить все столбцы вручную. Как я могу получить это сработает?
11 ответов:
Ну, сообщение об ошибке, в основном все сказано. У вас есть следующие варианты:
- сделать список столбцов (выберите на INFORMATION_SCHEMA.Колонки и хороший текстовый редактор или решения, предложенные Андомаром и Дэйвом, могут помочь вам в этом)
или
- добавить столбец идентификаторов в
tbl_A_archiveобычный (неидентичный) столбец int (поскольку это архивная таблица, зачем вам нужен столбец идентификаторов?).
SET IDENTITY_INSERT tableA ONвы должны сделать список столбцов для вашего оператора INSERT:
INSERT Into tableA ([id], [c2], [c3], [c4], [c5] ) SELECT [id], [c2], [c3], [c4], [c5] FROM tableBне нравится " вставить в таблицу выбрать ........"
SET IDENTITY_INSERT tableA OFF
Если вы используете SQL Server Management Studio, вам не нужно вводить список столбцов самостоятельно - просто щелкните правой кнопкой мыши таблицу в Обозреватель Объектов и выбрать таблицы скрипт ->выберите ->Новое Окно Редактора Запросов.
Если это не так, то запрос, подобный этому, должен помочь в качестве отправной точки:
SELECT SUBSTRING( (SELECT ', ' + QUOTENAME(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tbl_A' ORDER BY ORDINAL_POSITION FOR XML path('')), 3, 200000);
согласен с ответом Хайнци. Для первого второго варианта, вот запрос, который генерирует разделенный запятыми список столбцов в таблице:
select name + ', ' as [text()] from sys.columns where object_id = object_id('YourTable') for xml path('')для больших таблиц это может сэкономить много работы по набору текста:)
Если Таблица "Архив" предназначена для точной копии вашей основной таблицы, я бы просто предложил вам удалить тот факт, что идентификатор является столбцом Identity. Это позволит вам вставить их.
в качестве альтернативы вы можете разрешить и запретить вставки идентификаторов для таблицы со следующим утверждением
SET IDENTITY_INSERT tbl_A_archive ON --Your inserts here SET IDENTITY_INSERT tbl_A_archive OFFнаконец, если вам нужно, чтобы столбец идентификаторов работал как есть, вы всегда можете просто запустить сохраненный proc.
sp_columns tbl_A_archiveэто вернется вы все столбцы из таблицы, которые затем можно вырезать и вставить в запрос. (Это почти всегда лучше, чем с помощью*)
для инструкции SQL также необходимо указать список столбцов. Например.
INSERT INTO tbl (idcol1,col2) VALUES ( value1,value2)вместо
INSERT INTO tbl VALUES ( value1,value2)
чтобы заполнить все имена столбцов в список с разделителями-запятыми для оператора Select для решений, упомянутых для этого вопроса, я использую следующие параметры, поскольку они немного менее подробны, чем Andomar. Andomar по-прежнему вполне приемлемо, однако.
1)
SELECT column_name + ',' FROM information_schema.columns WHERE table_name = 'YourTable'2) это, вероятно, самый простой подход к созданию столбцов, если у вас есть SQL Server SSMS.
1) Перейти на таблица в Обозревателе объектов и нажмите на + слева от имени таблицы или дважды щелкните имя таблицы, чтобы открыть дополнительный список.
2) перетащите подпапку столбца в основную область запроса, и она автоматически отобразит весь список столбцов для вас.
оба будут работать, но если вы все еще получаете ошибку с помощью #1 тогда вперед #2
1)
SET IDENTITY_INSERT customers ON GO insert into dbo.tbl_A_archive(id, ...) SELECT Id, ... FROM SERVER0031.DB.dbo.tbl_A2)
SET IDENTITY_INSERT customers ON GO insert into dbo.tbl_A_archive(id, ...) VALUES(@Id,....)хорошего дня.
вы должны указать имя столбцов, которые вы хотите вставить, если есть столбец идентификаторов. Так что команда будет выглядеть следующим образом:
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('')(после удаления последней запятой (',')) просто скопируйте имя последних столбцов.
Это должно работать. Я просто столкнулся с вашей проблемой:
SET IDENTITY_INSERT dbo.tbl_A_archive ON; INSERT INTO dbo.tbl_A_archive (IdColumn,OtherColumn1,OtherColumn2,...) SELECT * FROM SERVER0031.DB.dbo.tbl_A; SET IDENTITY_INSERT dbo.tbl_A_archive OFF;к сожалению, кажется, что вам нужен список столбцов, включая столбец идентификаторов, чтобы вставить записи, которые определяют идентификатор. , вам не нужно перечислять столбцы в SELECT. Как @Dave Cluderay предполагается, что это приведет к форматированному списку для копирования и вставки (если менее 200000 символов).
я добавил использование, так как я переключаюсь между экземпляры.
USE PES SELECT SUBSTRING( (SELECT ', ' + QUOTENAME(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Provider' ORDER BY ORDINAL_POSITION FOR XML path('')), 3, 200000);
Я думаю, что эта ошибка возникает из-за несоответствия количества столбцов в определении таблицы и количества столбцов в запросе вставки. Также длина столбца опущена с введенным значением. Поэтому просто просмотрите определение таблицы, чтобы решить эту проблему
Comments