Insert from select mssql: SQL INSERT INTO SELECT Statement

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

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

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

С#

SQL

Привет,

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

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

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

Явное значение для столбца идентификаторов в таблице «attendmastm» может быть указано только в том случае, если используется список столбцов и 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 Операции вставки, извлечения, обновления, удаления с использованием хранимых процедур

В базе данных вам необходимо выполнить вставку, обновление и удаление. Если мы хотим создать надежную и высокопроизводительную систему, то эти четыре операции должны быть реализованы хранимыми процедурами. Хранимая процедура также предотвращает атаки Sql Injection и снижает сетевой трафик. Дополнительные сведения о хранимых процедурах см. в статье Перекомпиляция плана хранимых процедур и настройка производительности.

Операция вставки

Мы можем вставлять записи в таблицу (таблицы) с помощью хранимой процедуры, передавая данные во входных параметрах. Код ниже используется для вставки записи в таблицу «Сотрудник» с использованием хранимой процедуры

 CREATE TABLE Сотрудник
(
 EmpID int первичный ключ, имя varchar(50),
 Зарплата инт,
 Адрес varchar(100)
) 
 Вставить в Employee(EmpID,Name,Salary,Address) Values(1,'Mohan',16000,'Delhi')
Вставить в значения сотрудника (EmpID, имя, зарплата, адрес) (2, «Асиф», 15000, «Дели»)
Вставьте в значения сотрудника (EmpID, имя, зарплата, адрес) (3, 'Bhuvnesh', 19000, «Нойда»)
--См.  таблицу
SELECT * FROM Сотрудник 
 СОЗДАТЬ ПРОЦЕДУРУ usp_InsertEmployee
@flag bit output, -- вернуть 0 в случае неудачи, 1 в случае успеха
@EmpID целое,
@Имя varchar(50),
@Зарплата инт,
@Адрес varchar(100)
КАК
НАЧИНАТЬ
 НАЧАТЬ СДЕЛКУ
 НАЧАТЬ ПОПРОБУЙТЕ
Вставить в значения сотрудника(EmpID,имя,зарплата,адрес)(@EmpID,@имя,@зарплата,@адрес)
 установить @флаг=1;
ЕСЛИ @@TRANCOUNT > 0
 BEGIN зафиксировать ТРАНЗАКЦИЮ;
 КОНЕЦ
 КОНЕЦ ПОПЫТКИ
НАЧАТЬ ЛОВИТЬ
ЕСЛИ @@TRANCOUNT > 0
 НАЧАТЬ ОТКАТ ТРАНЗАКЦИИ;
 КОНЕЦ
 установить @флаг=0;
 КОНЦЕВОЙ ЗАХВАТ
КОНЕЦ 
 --Выполнить созданную выше процедуру для вставки строк в таблицу
Объявить бит @flag
EXEC usp_InsertEmployee @flag output,1,'Deepak',14000,'Noida'
если @флаг=1
 напечатать «Успешно вставлено»
еще
 print 'Есть какая-то ошибка' 
 --Выполнить созданную выше процедуру для вставки строк в таблицу
Объявить бит @flag
EXEC usp_InsertEmployee @flag output,4,'Deepak',14000,'Noida'
если @флаг=1
 напечатать «Успешно вставлено»
еще
 print 'Есть какая-то ошибка' 
 --теперь см.  измененную таблицу
Выберите * из Employee 

Retrieve Operation

Мы можем получить данные из одной или нескольких таблиц/представлений с помощью соединения, используя хранимую процедуру. Мы можем поместить несколько операторов SQL в одну хранимую процедуру. Код ниже используется для извлечения данных из таблицы «Сотрудник» с использованием хранимой процедуры

 — сначала мы вставляем данные в таблицу.
Вставить в значения сотрудника (EmpID, имя, зарплата, адрес) (1, «Мохан», 16000, «Дели»)
Вставить в значения сотрудника (EmpID, имя, зарплата, адрес) (2, «Асиф», 15000, «Дели»)
Вставьте в значения сотрудника (EmpID, имя, зарплата, адрес) (3, 'Bhuvnesh', 19000, «Нойда»)
идти
--Теперь мы создаем процедуру для получения данных
СОЗДАТЬ ПРОЦЕДУРУ usp_SelectEmployee
Как
Выберите * из ЗАКАЗА Сотрудника по EmpID 
 -- Выполните созданную выше процедуру для получения данных.
exec usp_SelectEmployee 

Операция обновления

Мы можем обновить записи таблицы (таблиц) с помощью хранимой процедуры, передав данные во входных параметрах. Код ниже используется для обновления таблицы «Сотрудник» с помощью хранимой процедуры

 CREATE PROCEDURE usp_UpdateEmployee
@flag bit output, -- вернуть 0 в случае неудачи, 1 в случае успеха
@EmpID целое,
@Зарплата инт,
@Адрес varchar(100)
КАК
НАЧИНАТЬ
 НАЧАТЬ СДЕЛКУ
 НАЧАТЬ ПОПРОБУЙТЕ
 Обновить набор сотрудников Salary=@Salary, Address=@Address
 Где EmpID=@EmpID
 установить @флаг=1;
ЕСЛИ @@TRANCOUNT > 0
 BEGIN зафиксировать ТРАНЗАКЦИЮ;
 КОНЕЦ
 КОНЕЦ ПОПЫТКИ
 НАЧАТЬ ЛОВИТЬ
ЕСЛИ @@TRANCOUNT > 0
 НАЧАТЬ ОТКАТ ТРАНЗАКЦИИ;
 КОНЕЦ
 установить @флаг=0;
 КОНЦЕВОЙ ЗАХВАТ
 КОНЕЦ 
 --Выполнить созданную выше процедуру для обновления таблицы
Объявить бит @flag
EXEC usp_UpdateEmployee @flag output,1,22000,'Noida'
если @flag=1 вывести «Успешно обновлено»
еще
 print 'Есть какая-то ошибка' 
 --теперь смотрите обновленную таблицу
Выберите * из Employee 

Удалить операцию

Мы можем удалить записи таблицы (таблиц) с помощью хранимой процедуры, передав данные во входных параметрах. Код ниже используется для обновления таблицы «Сотрудник» с использованием хранимой процедуры 9.0003

 СОЗДАТЬ ПРОЦЕДУРУ usp_DeleteEmployee
@flag bit output, -- вернуть 0 в случае неудачи, 1 в случае успеха
@EmpID целое
КАК
НАЧИНАТЬ
 НАЧАТЬ СДЕЛКУ
 НАЧАТЬ ПОПРОБУЙТЕ
 Удалить из сотрудника, где EmpID=@EmpID set @flag=1;
ЕСЛИ @@TRANCOUNT > 0
 BEGIN зафиксировать ТРАНЗАКЦИЮ;
 КОНЕЦ
 КОНЕЦ ПОПЫТКИ
 НАЧАТЬ ЛОВИТЬ
ЕСЛИ @@TRANCOUNT > 0
 НАЧАТЬ ОТКАТ ТРАНЗАКЦИИ;
 КОНЕЦ
установить @флаг=0;
КОНЦЕВОЙ ЗАХВАТ
END 
 --Выполнить созданную выше процедуру для удаления строк из таблицы
Объявить бит @flag
Выход EXEC usp_DeleteEmployee @flag, 4
если @флаг=1
 напечатать «Успешно удалено»
еще
 print 'Есть какая-то ошибка' 
 --теперь см. измененную таблицу
Выберите * из Employee 
Note
  1. В хранимой процедуре мы используем выходной параметр для возврата нескольких значений.

  2. Как правило, мы используем выходной параметр в хранимой процедуре, чтобы получить статус операции, как я использовал выше выходной параметр «@flag», чтобы получить статус операции, успешно ли она выполнена или нет.