Переконайтеся, що назви стовпців, типи даних та порядок у таблиці, з якої ви вибираєте записи, точно такі ж, як і цільова таблиця. Різниця повинна полягати лише в тому, що таблиця призначення має стовпець ідентичності як перший стовпець, тобто його немає у вихідній таблиці.
У мене виникли подібні проблеми, коли я виконував "INSERT INTO table_Dest SELECT * FROM table_source_linked_server_excel". У таблицях було 115 стовпців.
У мене було дві такі таблиці, куди я завантажував дані з Excel (як пов'язаний сервер) у таблиці в базі даних. У таблиці баз даних я додав стовпчик ідентичності під назвою 'id', якого там не було у вихідному Excel. Для однієї таблиці запит успішно працював, а в іншій я отримав помилку "Явне значення стовпця ідентичності в таблиці може бути вказане лише тоді, коли використовується список стовпців, а IDENTITY_INSERT ON SQL Server". Це було дивним, оскільки сценарій був точно однаковим для обох запитів. Тому я дослідив це, і я виявив, що у запиті, де я отримував помилку з INSERT INTO .. SELECT *:
- Деякі назви стовпців у вихідній таблиці були змінені, хоча значення були правильними
- Було кілька додаткових стовпців за межами реальних стовпців даних, які вибирав SELECT *. Я виявив це, скориставшись опцією "Таблиця сценаріїв як> Вибрати для> нове вікно запитів" у таблиці Excel (на підключених серверах). Після останнього стовпця в Excel був один прихований стовпчик, хоча він не мав жодних даних. Я видалив цей стовпець у вихідній таблиці Excel і зберег його.
Після внесення вищезазначених змін запит на INSERT INTO ... SELECT * запустився успішно. Стовпчик ідентичності в таблиці призначення генерує значення ідентичності для кожного вставленого рядка, як очікувалося.
Отже, незважаючи на те, що в таблиці призначення може бути стовпчик ідентичності, якого немає в таблиці джерела, INSERT INTO .. SELECT * буде успішно запускатися, якщо імена, типи даних та порядок стовпців у джерелі та цілях точно однакові.
Сподіваюся, це комусь допоможе.