首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在SQL Server中同时向两个表中插入数据?

如何在SQL Server中同时向两个表中插入数据?
EN

Stack Overflow用户
提问于 2010-09-15 04:34:06
回答 4查看 139.3K关注 0票数 53

假设我的表结构如下所示:

代码语言:javascript
复制
CREATE TABLE [dbo].[table1] (
    [id] [int] IDENTITY(1,1) NOT NULL,
    [data] [varchar](255) NOT NULL,
    CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED ([id] ASC)
)

CREATE TABLE [dbo].[table2] (
    [id] [int] IDENTITY(1,1) NOT NULL,
    [table1_id] [int] NOT NULL,
    [data] [varchar](255) NOT NULL,
    CONSTRAINT [PK_table2] PRIMARY KEY CLUSTERED ([id] ASC)
)

第一个表的[id]字段对应于第二个表的[table1_id]字段。我想做的是在单个事务中将数据插入到两个表中。现在,我已经知道如何通过执行INSERT-SELECT-INSERT来完成此操作,如下所示:

代码语言:javascript
复制
BEGIN TRANSACTION;
DECLARE @id [int];
INSERT INTO [table1] ([data]) VALUES ('row 1');
SELECT @id = SCOPE_IDENTITY();
INSERT INTO [table2] ([table1_id], [data]) VALUES (@id, 'more of row 1');
COMMIT TRANSACTION;

对于像这样的小情况来说,这一切都很好,因为在这种情况下,您可能只插入少数几行。但我需要做的是一次插入几十万行,甚至可能是一百万行。数据来自另一个表,所以如果我只将其插入到一个表中,这将很容易,我只需要这样做:

代码语言:javascript
复制
INSERT INTO [table] ([data])
SELECT [data] FROM [external_table];

但是,我如何做到这一点并将数据拆分为[table1][table2],同时仍然使用适当的[table1_id]更新[table2]呢?这有可能吗?

EN

回答 4

Stack Overflow用户

发布于 2010-09-15 05:00:12

请注意SQL Server是否支持“INSERT ALL”语句。Oracle已经有了,它看起来像这样(SQL Cookbook):

代码语言:javascript
复制
insert all
  when loc in ('NEW YORK', 'BOSTON') THEN
   into dept_east(deptno, dname, loc) values(deptno, dname, loc)
  when loc in ('CHICAGO') THEN
   into dept_mid(deptno, dname, loc) values(deptno, dname, loc)
  else
   into dept_west(deptno, dname, loc) values(deptno, dname, loc)
select deptno, dname, loc
  from dept
票数 1
EN

Stack Overflow用户

发布于 2010-09-15 04:54:50

代码语言:javascript
复制
BEGIN TRANSACTION;

DECLARE @tblMapping table(sourceid int, destid int)

INSERT INTO [table1] ([data]) 
OUTPUT source.id, new.id
Select [data] from [external_table] source;

INSERT INTO [table2] ([table1_id], [data])
Select map.destid, source.[more data] 
from [external_table] source
    inner join @tblMapping map on source.id=map.sourceid;

COMMIT TRANSACTION;
票数 0
EN

Stack Overflow用户

发布于 2010-09-15 04:44:42

您可以编写一个遍历您提议的事务的存储过程。迭代器将是包含源数据的表的游标。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3712678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档