Refactoriser un insert SQL Looping

Cette instruction d'insertion fonctionne. Mais, j'espère que quelqu'un peut m'apprendre un moyen plus efficace de faire cette requête. Voici ce que j'ai …

J'ai une table appelée Source dans laquelle DealerID est un ID non unique (dans ce tableau de toute façon). Pour chaque identifiant de revendeur, il existe plusieurs noms. Exemple:

15 BillBoard 15 Event 15 Newspaper 16 BillBoard 16 Event 16 Newspaper 

Je sais je sais. C'est un moyen très inefficace pour stocker ces données. Nous traitons avec une application héritée, et je ne peux pas réviser cette structure de données pour le moment. Donc, ce que je dois faire est d'append deux nouveaux loggings par DealerID. Un pour «Téléphone» et un pour «Internet». Donc, après l'insertion, cela ressemblerait à ceci:

 15 BillBoard 15 Event 15 Newspaper 15 Phone 15 Internet 16 BillBoard 16 Event 16 Newspaper 16 Phone 16 Internet 

La déclaration sql ci-dessous fonctionne, mais je me request s'il y a un meilleur moyen …

 declare @SourceTemp table ( [Id] int identity (1, 1) not null, [DealerId] int ) insert into @SourceTemp select distinct DealerId from Source where DealerId is not null declare @dealerid int declare @rowcount int = 1 declare @idcount int select @idcount = max(Id) from @SourceTemp while @rowcount < (@idcount + 1) begin select @dealerid = DealerId from @SourceTemp where Id = @rowcount ---------------- Insert Phone if not exists (select * from Source where DealerId = @dealerid and Name = 'Phone') begin insert into Source ([DealerID],[Name],[Service],[CampaignCode],[Description],[Created],[UserCreated],[Active]) values (@dealerid, 'Phone', 'Generic', 'CampaignCode', NULL, GETDATE(), 0, 1) end --------------- Insert Internet if not exists (select * from Source where DealerId = @dealerid and Name = 'Internet') begin insert into Source ([DealerID],[Name],[Service],[CampaignCode],[Description],[Created],[UserCreated],[Active]) values (@dealerid, 'Internet', 'Generic', 'CampaignCode', NULL, GETDATE(), 0, 1) end set @rowcount = @rowcount + 1 end 

EDIT APRES:

J'ai dû faire un petit mod à la réponse par Tom, en ajoutant le DISTINCT. Cela marche…

 INSERT INTO Source ([DealerID], [Name], [Service], [CampaignCode], [Description], [Created], [UserCreated], [Active]) SELECT DISTINCT S.DealerId, SQ.Name, 'Generic', 'CampaignCode', NULL, GETDATE(), 0, 1 FROM Source S CROSS JOIN (SELECT 'Internet' AS Name UNION ALL SELECT 'Phone' AS Name) SQ WHERE NOT EXISTS (SELECT * FROM Source WHERE DealerID = S.DealerID AND Name = SQ.Name) 

 INSERT INTO Source (DealerID, Name, Service, CampaignCode, Description, ...) SELECT DISTINCT S.DealerID, SQ.Name, ... FROM Source S CROSS JOIN (SELECT 'Internet' AS Name UNION ALL SELECT 'Phone' AS Name) SQ WHERE NOT EXISTS (SELECT * FROM Source WHERE DealerID = S.DealerID AND Name = SQ.Name) 

Corrigé pour inclure le DISTINCT, car il y aura plusieurs autres Name pour chaque DealerID là-bas. Si les performances sont un problème, vous pouvez déplacer DISTINCT vers une sous-requête sur la table Source , puis sur CROSS JOIN partir de là:

 INSERT INTO Source (DealerID, Name, Service, CampaignCode, Description, ...) SELECT DISTINCT S.DealerID, SQ.Name, ... FROM (SELECT DISTINCT DealerID FROM Source ) S CROSS JOIN (SELECT 'Internet' AS Name UNION ALL SELECT 'Phone' AS Name) SQ WHERE NOT EXISTS (SELECT * FROM Source WHERE DealerID = S.DealerID AND Name = SQ.Name)