Я пытаюсь сделать этот запрос
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 установлен в ON.
tbl_A
огромная таблица в строках и ширине, то есть имеет много столбцов. Я не хочу печатать все столбцы вручную. Как я могу заставить это работать?
sql-server
jhowe
источник
источник
Ответы:
Резюме
SQL Server не позволит вам вставить явное значение в столбец идентификаторов, если вы не используете список столбцов. Таким образом, у вас есть следующие варианты:
ИЛИ
tbl_A_archive
обычном столбце без идентификаторов : если ваша таблица является архивной таблицей, и вы всегда указываете явное значение для столбца идентификаторов, зачем вам вообще нужен столбец идентификаторов? Просто используйте обычный int вместо.Подробная информация о решении 1
Вместо того
тебе нужно написать
с
field1, field2, ...
содержанием имен всех столбцов в ваших таблицах. Если вы хотите автоматически сгенерировать этот список столбцов, взгляните на ответ Дейва или ответ Андомара .Подробная информация о решении 2
К сожалению, невозможно просто «изменить тип» столбца типа int на столбец типа int без идентификатора. По сути, у вас есть следующие варианты:
ИЛИ
Identity Specification
/(Is Identity)
столбца идентификаторов в таблице архива значениеNo
. За кулисами это создаст скрипт для воссоздания таблицы и копирования существующих данных, поэтому для этого вам также нужно будет удалитьTools
/Options
/Designers
/Table and Database Designers
/Prevent saving changes that require table re-creation
.ИЛИ
источник
Вы должны составить список столбцов для вашего оператора INSERT:
не похоже на "Вставить в таблицу A SELECT ........"
источник
Если вы используете SQL Server Management Studio, вам не нужно вводить список столбцов самостоятельно - просто щелкните правой кнопкой мыши таблицу в обозревателе объектов и выберите Таблица сценариев как -> ВЫБРАТЬ - -> Окно нового редактора запросов .
Если нет, то запрос, подобный этому, должен помочь в качестве отправной точки:
источник
Согласитесь с ответом Хайнци. Для первого второго варианта, вот запрос, который генерирует разделенный запятыми список столбцов в таблице:
Для больших таблиц это может сэкономить много печатной работы :)
источник
Если «архивная» таблица должна быть точной копией вашей основной таблицы, я бы просто предложил вам удалить тот факт, что id является столбцом идентификаторов. Таким образом, это позволит вам вставить их.
В качестве альтернативы вы можете разрешить и запретить вставку идентификаторов для таблицы с помощью следующего оператора
Наконец, если вам нужно, чтобы столбец идентификаторов работал как есть, вы всегда можете просто запустить сохраненный процесс.
Это вернет вам все столбцы из таблицы, которые вы можете затем вырезать и вставить в свой запрос. (Это почти всегда лучше, чем использование *)
источник
Для оператора SQL вы также должны указать список столбцов. Например,
вместо того
источник
Оба будут работать, но если вы все равно получите ошибку, используя # 1, тогда перейдите к # 2
1)
2)
источник
Чтобы заполнить все имена столбцов в списке, разделенном запятыми, для оператора Select для решений, упомянутых для этого вопроса, я использую следующие параметры, так как они немного менее многословны, чем большинство ответов здесь. Хотя большинство ответов здесь все же вполне приемлемо.
1)
2) Это, вероятно, самый простой подход к созданию столбцов, если у вас есть SQL Server SSMS.
источник
Вам необходимо указать имя столбца, который вы хотите вставить, если есть столбец Identity. Таким образом, команда будет выглядеть так:
Если в вашей таблице много столбцов, используйте эту команду для получения имени этих столбцов.
(после удаления последней запятой (',')) Просто скопируйте имя последнего столбца.
источник
Это должно работать. Я просто столкнулся с вашей проблемой:
К сожалению, кажется, вам нужен список столбцов, включая столбец идентификаторов, чтобы вставить записи, в которых указан идентификатор. Тем не менее , вы не должны перечислять столбцы в SELECT. Как предположил @Dave Cluderay, это приведет к тому, что вы сможете скопировать и вставить отформатированный список (если меньше 200000 символов).
Я добавил ИСПОЛЬЗОВАНИЕ, так как я переключаюсь между экземплярами.
источник
Не так
источник
Этот фрагмент кода показывает, как вставить в таблицу, когда столбец идентификатора первичного ключа включен.
источник
Если вы хотите вставить свои значения из одной таблицы в другую через хранимую процедуру. Я использовал это и это , последнее, что почти как ответ Андомара.
источник
Существует один или несколько столбцов, которые имеют свойство автоинкремента, или значение этого атрибута будет рассчитываться как ограничение. Вы пытаетесь изменить этот столбец.
Есть два способа решить это: 1) Явно упомянуть другие столбцы и установить только их значения, и значение PrimaryKey или значение автоинкремента будет установлено автоматически.
2) Вы можете включить INDENTITY_INSERT, затем выполнить запрос вставки и, наконец, отключить IDENTITY_INSERT.
Предложение: выполните первый шаг, потому что это более подходящий и эффективный подход.
Для получения дополнительной информации прочитайте эту статью на SQL-помощник .
источник
Убедитесь, что имена столбцов, типы данных и порядок в таблице, из которой вы выбираете записи, в точности совпадают с таблицей назначения. Единственная разница должна заключаться в том, что таблица назначения имеет столбец идентификатора в качестве первого столбца, которого нет в исходной таблице.
Я столкнулся с подобной проблемой, когда выполнял «INSERT INTO table_Dest SELECT * FROM table_source_linked_server_excel». Таблицы имели 115 столбцов.
У меня было две такие таблицы, где я загружал данные из Excel (как связанный сервер) в таблицы в базе данных. В таблицах базы данных я добавил столбец идентификаторов «id», которого не было в исходном Excel. Для одной таблицы запрос выполнялся успешно, а в другой я получил сообщение об ошибке «Явное значение для столбца идентификаторов в таблице можно указывать только в том случае, если используется список столбцов, а IDENTITY_INSERT включен ON SQL Server». Это было загадочно, так как сценарий был одинаковым для обоих запросов. Поэтому я исследовал это и обнаружил, что в запросе, где я получаю сообщение об ошибке с INSERT INTO .. SELECT *:
После двух вышеуказанных изменений запрос INSERT INTO ... SELECT * был успешно выполнен. Столбец идентификаторов в таблице назначения генерирует значения идентификаторов для каждой вставленной строки, как и ожидалось.
Таким образом, даже если таблица назначения может иметь столбец идентификаторов, которого нет в исходной таблице, INSERT INTO .. SELECT * будет успешно выполнен, если имена, типы данных и порядок столбцов в источнике и месте назначения точно совпадают.
Надеюсь, это кому-нибудь поможет.
источник
Я думаю, что эта ошибка происходит из-за несоответствия с количеством столбцов в определении таблицы и количеством столбцов в запросе вставки. Также длина столбца опускается с введенным значением. Так что просто просмотрите определение таблицы, чтобы решить эту проблему
источник