Вставьте несколько строк в несколько таблиц без повторения INSERT INTO

Мне дали набор данных в EXCEL (600+ строк), которые мне нужно вставить в 3 разные таблицы (Членство, Учетная запись, Участник). Данные выглядят примерно так:

ID    FirstName    LastName    DOB        Account_Type  Status    Participant_Code    Participant_Type
1     John         Smith       5/5/1960   Gold          Active    002                 A
2     Hello        World       4/9/1975   Platinum      Inactive  002                 A
.
.
.
600

Мне необходимо:

INSERT INTO Membership (ID, FirstName, LastName, DOB)
VALUES (1, 'John', 'Smith', '5/5/1960')

INSERT INTO Membership (ID, FirstName, LastName, DOB)
VALUES (2, 'Hello", 'World", '4/9/1975')

INSERT INTO Account(ID, Type, Effective_Date, Status)
VALUES (1, 'Gold', GetDate(), 'Active')

INSERT INTO Account(ID, Type, Effective_Date, Status)
VALUES (2, 'Platinum', GetDate(), 'Inactive')

INSERT INTO Participant(ID, Code, Type)
VALUES (1, 002, 'A')

INSERT INTO Participant(ID, Code, Type)
VALUES (2, 002, 'A')

Я не хочу повторять оператор 600 * 3 INSERT. Каковы мои варианты?

Редактировать: извините, забыл упомянуть - массовая вставка невозможна из-за ограничений на моей рабочей станции.

Обновление: Донал предоставил мне хорошую отправную точку. Несмотря на то, что мне по-прежнему нужно более 600 операторов INSERT, с помощью Донала, по крайней мере, мне не нужно писать операторы самому. Кроме того, я изменил свой код, чтобы сделать его более эффективным:

Во-первых, я CREATE and INSERT эти 600 строк во временную таблицу.

CREATE TABLE #temp_table (
ID               INT,
FirstName        VARCHAR(50),
LastName         VARCHAR(50),
DOB              DATE,
Account_Type     VARCHAR(10),
Status           VARCHAR(8),
Participant_Code CHAR(3),
Participant_Type CHAR(1)
)

INSERT INTO #temp_table (1, 'John', 'Smith, '5/5/1960', 'Gold', 'Active', '002', 'A')
.
.
so on

Затем для конкретной таблицы я могу просто использовать оператор INSERT INTO... SELECT

INSERT INTO Membership
SELECT ID, FirstName, LastName, DOB FROM #temp_table

INSERT INTO Account
SELECT ID, Account_Type, Status, GetDate() FROM #temp_table

INSERT INTO Participant
SELECT ID, Participant_Code, participant_type FROM #temp_table

person C.J.    schedule 12.08.2014    source источник
comment
Вы знакомы с мастером массовой вставки из SSMS?   -  person Kritner    schedule 12.08.2014
comment
stackoverflow.com/ вопросы/452859/   -  person xQbert    schedule 12.08.2014
comment
@xQbert Я провел исследование, прежде чем опубликовать здесь свой вопрос. Ссылка, которую вы мне показали, только сокращает ключевое слово VALUES, а мне все равно нужно ввести данные 600*3 раза   -  person C.J.    schedule 12.08.2014
comment
Это уменьшает Insert into tableName (field names) values. данные еще должны быть перечислены; иначе как бы его вставили...   -  person xQbert    schedule 12.08.2014
comment
@xQbert Только что узнал, что ваш метод не работает и в SQL Server 2000...   -  person C.J.    schedule 13.08.2014


Ответы (2)


В Excel вы можете динамически генерировать операторы SQL. Вы создаете формулу, которая содержит sql в строке, и динамически объединяете значения. Например, см. здесь.

person Donal    schedule 12.08.2014
comment
Извините, забыл упомянуть - массовая вставка невозможна из-за ограничений на моей рабочей станции. - person C.J.; 12.08.2014
comment
поэтому в Excel вы можете динамически генерировать операторы SQL. Вы создаете формулу, которая содержит sql в строке, и динамически объединяете значения. - person Donal; 12.08.2014
comment
примерно так: chandoo.org /wp/2008/09/22/ - person Donal; 12.08.2014
comment
Можете ли вы изменить свой ответ, чтобы он отражал ваш комментарий, тогда я могу проголосовать за вас. - person C.J.; 12.08.2014
comment
Как это не повторяет оператор 600 * 3 INSERT. Каковы мои варианты? - person xQbert; 12.08.2014

Вы можете сделать что-то вроде этого

INSERT INTO Membership (ID, FirstName, LastName, DOB)
VALUES (1, 'John', 'Smith', '5/5/1960'),
       (2, 'Hello', 'World', '4/9/1975')

INSERT INTO Account(ID, Type, Effective_Date, Status)
VALUES (1, 'Gold', GetDate(), 'Active'),
       (2, 'Platinum', GetDate(), 'Inactive')

INSERT INTO Participant(ID, Code, Type)
VALUES (1, 002, 'A'),
       (2, 002, 'A')

Изменить

Чтобы избежать большого количества ручного ввода, вы можете использовать следующие методы для конкретной СУБД.

  1. Для mysql вы можете экспортировать файл как файл .csv и импортировать, используя это метод

  2. Для postgresql вы можете импортировать файл .csv следующим образом:

    >>psql mydatabase
    >>COPY mytable FROM '/myfile.csv' USING DELIMITERS ',';
    
  3. Для сервера Microsoft sql (2000/2005) будет полезна эта статья базы знаний. Другой простой способ можно найти здесь

  4. Для базы данных Oracle стоит прочитать эту статью.

person Himanshu Lakhara    schedule 12.08.2014
comment
Спасибо за попытку, но, как я уже упоминал в своем комментарии, это только уменьшает ключевое слово VALUES, но не помогает мне уменьшить необходимость ввода данных 600 * 3 раза - person C.J.; 12.08.2014
comment
@C.J. Вы можете экспортировать файл Excel как .csv, и в зависимости от базы данных вы можете импортировать этот файл. для mysql см. это - person Himanshu Lakhara; 12.08.2014
comment
@C.J. Для сервера sql вы можете использовать эту статью базы знаний. (support.microsoft.com/kb/321686) - person Himanshu Lakhara; 13.08.2014