Comment puis-je INSÉRER des données dans deux tables en même temps dans SQL Server?

Disons que mon tableau de structure ressemble à quelque chose comme ceci:

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)
)

La [id] champ de la première table correspond à la [table1_id] champ de la seconde. Ce que je voudrais faire est d'insérer des données dans deux tables en une seule transaction. Maintenant, je sais déjà comment faire cela en faisant INSÉRER-SÉLECTIONNEZ-INSÉRER, comme ceci:

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;

C'est tout bon et très bien pour de petites affaires comme celle où vous êtes seule l'insertion, peut-être une poignée de lignes. Mais ce dont j'ai besoin pour faire est d'insérer un couple de centaines de milliers de lignes, ou peut-être même un million de lignes, tout à la fois. Les données proviennent d'une autre table, donc si je n'avais que de l'insérer dans une table unique, il serait facile, que je venais de faire ceci:

INSERT INTO [table] ([data])
SELECT [data] FROM [external_table];

Mais comment pourrais-je faire cela et de diviser les données en [table1] et [table2], et de toujours mettre à jour [table2] avec le [table1_id] que je suis en train de faire? Est-il même possible?

  • Belle question beaucoup de débutants de SQL demandent souvent.
InformationsquelleAutor soapergem | 2010-09-14