将多行插入多个表而不重复“INSERT INTO”

Posted

技术标签:

【中文标题】将多行插入多个表而不重复“INSERT INTO”【英文标题】:Insert multiple rows into multiple table without repeating "INSERT INTO" 【发布时间】:2014-08-12 17:43:39 【问题描述】:

我在 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

【问题讨论】:

您熟悉 SSMS 的批量插入向导吗? ***.com/questions/452859/… @xQbert 在这里发布我的问题之前我已经完成了我的研究。你给我看的链接只减少了VALUES关键字,但我还是需要输入数据600 * 3次 它减少了Insert into tableName (field names) values。数据仍需列出;不然怎么插入... @xQbert 刚刚发现您的方法在 SQL Server 2000 中也不起作用... 【参考方案1】:

在 Excel 中,您可以动态生成 SQL 语句。您创建一个在字符串中包含 sql 的公式并动态连接这些值。例如-see here。

【讨论】:

抱歉,忘记提及 - 由于我的工作站限制,无法选择批量插入。 因此,您可以在 Excel 中动态生成 SQL 语句。您创建一个在字符串中包含 sql 并动态连接值的公式。 类似这样的东西:chandoo.org/wp/2008/09/22/… 您能否更改您的回答以反映您的评论,然后我可以给您投票。 这怎么不“重复 600 * 3 INSERT 语句。我有什么选择?”【参考方案2】:

你可以这样做

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')

编辑

为避免大量手动输入,您可以针对特定 DBMS 使用以下方法

    对于 mysql,您可以将文件导出为 .csv 文件并使用 this method 导入

    对于 postgresql,您可以导入 .csv 文件运行以下

    >>psql mydatabase
    >>COPY mytable FROM '/myfile.csv' USING DELIMITERS ',';
    

    对于 microsoft sql server (2000/2005) this 知识库文章会很有用。另一个简单的方法可以找到here

    关于oracle数据库this的文章值得一读。

【讨论】:

感谢您的尝试,但就像我在评论中提到的那样,它只会减少VALUES 关键字,但并不能帮助我减少600 * 3次输入数据的需要 @C.J.您可以将您的 excel 文件导出为 .csv,并且根据数据库,您可以导入此文件。对于 mysql,请参阅 this @C.J.对于 sql server,您可以使用此知识库文章。 (support.microsoft.com/kb/321686)

以上是关于将多行插入多个表而不重复“INSERT INTO”的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重复声明的“INSERT INTO dbo.Blah”部分的情况下插入多行?

INSERT INTO .. ON DUPLICATE KEY更新多行记录

INSERT INTO .. ON DUPLICATE KEY更新多行记录

SQL INSERT INTO 多行 [重复]

求助~~ INSERT INTO....SELECT怎么一次性插入多行数据

sql INSERT INTO - 多个值,多行示例