将多行插入多个表而不重复“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更新多行记录