soa*_*gem 51 sql t-sql sql-server foreign-keys insert
假设我的表结构看起来像这样:
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)
)
Run Code Online (Sandbox Code Playgroud)
第[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;
Run Code Online (Sandbox Code Playgroud)
对于那些只插入少量行的小案例来说,这一切都很好.但我需要做的是一次插入几十万行,甚至一百万行.数据来自另一个表,所以如果我只是将它插入一个表中,那将很容易,我只需要这样做:
INSERT INTO [table] ([data])
SELECT [data] FROM [external_table];
Run Code Online (Sandbox Code Playgroud)
不过,我会怎么做这和数据分割成[table1]和[table2],而且还更新[table2]与适当的[table1_id],因为我做什么呢?这甚至可能吗?
Den*_*eev 30
试试这个:
insert into [table] ([data])
output inserted.id, inserted.data into table2
select [data] from [external_table]
Run Code Online (Sandbox Code Playgroud)
更新:回复:
Denis - 这似乎与我想做的非常接近,但也许你可以为我修复以下SQL语句?基本上[table1]中的[data]和[table2]中的[data]表示来自[external_table]的两个不同/不同的列.您在上面发布的声明仅在您希望[data]列相同时才有效.
INSERT INTO [table1] ([data])
OUTPUT [inserted].[id], [external_table].[col2]
INTO [table2] SELECT [col1]
FROM [external_table]
Run Code Online (Sandbox Code Playgroud)
在insert语句中输出外部列是不可能的,所以我认为你可以做这样的事情
merge into [table1] as t
using [external_table] as s
on 1=0 --modify this predicate as necessary
when not matched then insert (data)
values (s.[col1])
output inserted.id, s.[col2] into [table2]
;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
128174 次 |
| 最近记录: |