Допустим, моя структура таблицы выглядит примерно так:
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]
, и все же обновить [table2]
с помощью соответствующего [table1_id]
, как я это делаю? Это вообще возможно?