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
В хранимой процедуре мы используем выходной параметр для возврата нескольких значений.
Как правило, мы используем выходной параметр в хранимой процедуре, чтобы получить статус операции, как я использовал выше выходной параметр «@flag», чтобы получить статус операции, успешно ли она выполнена или нет.