Select insert into ms sql: SQL INSERT INTO SELECT Statement

[Решено] Как вставить в таблицу из оператора select, когда присутствует столбец IDENTITY

0.00/5 (Нет голосов)

Узнать больше:

С#

SQL

Привет,

У нас есть таблица SQL ‘attendmast’. В конце каждого месяца нам нужно добавить данные из этой таблицы в другую таблицу «attendmastm». Обе таблицы имеют одинаковый набор столбцов. Для этого мы используем следующую команду:

вставить в Attentmastm выбрать * из Attentmast 

Это возвращает ошибку

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

Мы понимаем, что «выбрать *» не является хорошей практикой кодирования. .. но в этом случае мы не можем указать столбцы, так как программно мы получаем имя таблицы, и эта операция должна быть выполнена для этой таблицы.

Пожалуйста, предложите любой выход. Заранее спасибо.

Что пробовал:

Пробовал гуглить. Нашел несколько ссылок, говорящих об этом. Но не совсем то, что мы хотим.

Добавить решение


3 решения

  • Самые популярные

  • Самые последние

Решение 3

Если вы хотите, чтобы значение ключа изменялось при копировании данных из исходной таблицы в целевую, тогда вам подойдет Решение 1.

Однако, поскольку вы описываете, что хотите добавить данные, я могу предположить, что значение ключа должно быть таким же в целевой таблице, как и в исходной таблице. Если это так, вы можете использовать оператор SET IDENTITY_INSERT, чтобы позволить вам определить значение ключевого столбца независимо от того, является ли он идентификатором. ]

Но если это так, вам следует принять во внимание две вещи:
— Почему целевая таблица содержит столбец идентификации, если все данные однозначно идентифицируются в исходной таблице.
— Ежемесячное копирование данных в таблицу из другой таблицы звучит так, будто вы пытаетесь решить какую-то другую проблему, возможно, связанную с производительностью. Если это так, то я считаю, что это может быть не лучший вариант. Перемещение данных часто приводит к ненужной сложности, в то время как первоначальная проблема производительности, возможно, может быть решена с помощью других решений.

Решение 1

Поскольку в таблицах всегда одни и те же столбцы, просто перечислите столбцы в обеих:

.
ВСТАВИТЬ В Attenmatsm (столбец2, столбец3) ВЫБРАТЬ столбец2, столбец3 ИЗ Attentmast 

Поскольку таблицы имеют один и тот же столбец, все они должны иметь одинаковое имя, независимо от имени таблицы.
Если они этого не сделают, есть вероятность, что определение таблицы будет неправильным, и вы будете вставлять неверные данные в свою главную таблицу.

Но это выглядит как плохой дизайн — я не уверен, что именно вы пытаетесь сделать с данными, но есть вероятность, что ваша структура хранения неверна.

Решение 2

Поскольку вы получаете имя таблицы прагматично; вы также можете получить имя столбца этой таблицы, используя следующий запрос:

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS где table_schema='dbo' и TABLE_NAME = 'attendmast' 

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

Это может тебе помочь.

Добавить решение

Этот контент, а также любой связанный с ним исходный код и файлы находятся под лицензией The Code Project Open License (CPOL)

SQL SERVER — как преобразовать набор результатов оператора Select в операторы Insert когда им необходимо перенести небольшой объем данных из одного экземпляра в другой или из одной среды в другую.

Недавно я создал одну из новых баз данных филиалов моего клиента из базы данных других филиалов и столкнулся с этим сценарием. К счастью, со времен SQL Server 2005 у нас есть решение, но оно было очень сложным, особенно когда вам нужно было сделать это для таблиц, так как они имеют множество столбцов. Причина Я пишу это решение в том, что вы можете сделать это за несколько кликов в SQL Server 2012 и выше.
Прежде чем приступить к решению, я хотел бы создать образец для демонстрации решения.

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

ИСПОЛЬЗОВАНИЕ [AdventureWorks2012]
ИДТИ
ВЫБЕРИТЕ [ИД отдела]
,[Имя] + 'Отдел' Как [Имя]
,[Имя группы]
,Getdate() как [ModifiedDate]
ОТ [Отдела кадров].[Отдел]
ИДТИ
 

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

Решение 1. Использование конкатенации строк (традиционный метод)
В этом решении необходимо объединить результирующий набор оператора Select, чтобы преобразовать его в оператор Insert (с некоторыми изменениями данных). Вы должны убедиться, что одинарные кавычки (‘) находятся в правильных местах. Кроме того, если данные в результирующем наборе не относятся к строковому типу данных, вы должны преобразовать их в строковый тип данных для объединения. В случае, если в таблице есть столбец идентификаторов, вы должны передать имя столбца в операторе INSERT, а также с помощью SET IDENTITY_INSERT. Причина, по которой я НЕ  рекомендовать это решение, потому что если у вас больше столбцов в таблице, потребуется больше времени для разработки и отладки.

ИСПОЛЬЗОВАНИЕ [AdventureWorks2012]
ИДТИ
ВЫБРАТЬ
'ВСТАВИТЬ В tbl_sample (
[DepartmentID],[Name],[GroupName],[ModifiedDate])
ЗНАЧЕНИЯ(' + ПРЕОБРАЗОВАТЬ(VARCHAR(50),[DepartmentID])
+ ',''' + [Имя] + 'Отдел'','
+ ''''+ [Имя группы] + ''','
+ ''''+ ПРЕОБРАЗОВАТЬ(VARCHAR(50),GETDATE(),120) + ''')'
ОТ [Отдела кадров]. [Отдел]
ИДТИ
 

Решение 2. Использование сценария создания (новый метод)
Этот метод применим к SQL Server 2012 и более поздним версиям и покажется вам довольно простым. Позвольте мне объяснить этот метод, используя два простых шага.

Шаг 1:
Прежде всего, вам нужно разработать оператор выбора, как это сделал я в образце, на основе ваших требований и ВСТАВИТЬ В ТАБЛИЦУ, как показано ниже.

ИСПОЛЬЗОВАНИЕ [AdventureWorks2012]
ИДТИ
ВЫБЕРИТЕ [ИД отдела]
,[Имя] + 'Отдел' Как [Имя]
,[Имя группы]
,Getdate() как [ModifiedDate]
INTO [tbl_Department_Sample] -- Результирующий набор вставлен в таблицу
ОТ [Отдела кадров].[Отдел]
ИДТИ
 

Шаг 2:
Набор результатов оператора select вставлен в таблицу ([tbl_Department_Sample]). Теперь вам просто нужно сгенерировать сценарий (только данные) таблицы ([tbl_Department_Sample]), используя функцию «Создать сценарий» в SQL Server 2012 и более поздних версиях.