Вмъкнете множество редове в множество таблици, без да повтаряте 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, с помощта на Donal, поне не трябва да пиша израза сам. Освен това промених кода си, за да го направя по-ефективен:

Първо, аз 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 сървър можете да използвате тази статия от KB. (support.microsoft.com/kb/321686) - person Himanshu Lakhara; 13.08.2014