假设我的表结构如下所示:
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来完成此操作,如下所示:
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;
对于像这样的小情况来说,这一切都很好,因为在这种情况下,您可能只插入少数几行。但我需要做的是一次插入几十万行,甚至可能是一百万行。数据来自另一个表,所以如果我只将其插入到一个表中,这将很容易,我只需要这样做:
INSERT INTO [table] ([data])
SELECT [data] FROM [external_table];
但是,我如何做到这一点并将数据拆分为[table1]
和[table2]
,同时仍然使用适当的[table1_id]
更新[table2]
呢?这有可能吗?
发布于 2010-09-15 05:00:12
请注意SQL Server是否支持“INSERT ALL”语句。Oracle已经有了,它看起来像这样(SQL Cookbook):
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
发布于 2010-09-15 04:54:50
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;
发布于 2010-09-15 04:44:42
您可以编写一个遍历您提议的事务的存储过程。迭代器将是包含源数据的表的游标。
https://stackoverflow.com/questions/3712678
复制相似问题