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