web-dev-qa-db-fra.com

Insertion de SQL Server 2008 avec WHILE LOOP

J'ai des enregistrements existants comme

ID    Hospital ID     Email                Description 
1       15         [email protected]           Sample Description
2       15         [email protected]          Random Text

J'ai besoin d'utiliser une boucle WHILE pour insérer des lignes avec l'ID de l'hôpital changeant en une valeur spécifique ou 32 dans ce cas, tandis que les autres (pas l'ID car il est généré automatiquement) restent constants.

Il devrait alors ressembler à

ID    Hospital ID     Email                Description 
1       15         [email protected]           Sample Description
2       15         [email protected]          Random Text
3       32         [email protected]           Sample Description
4       32         [email protected]          Random Text

Notez que ce qui précède a maintenant deux nouvelles lignes avec ID et ID d'hôpital différents. L'ID est généré automatiquement.

J'ai plusieurs tableaux où j'ai besoin de faire les mêmes mises à jour. Je ne veux pas utiliser le curseur si je peux le faire avec une boucle while.

EDIT La boucle while abandonnée comme solution plus simple a été fournie dans la réponse acceptée.

6
Mukus

En supposant que ID est une colonne d'identité:

INSERT INTO TheTable(HospitalID, Email, Description)
SELECT 32, Email, Description FROM TheTable
WHERE HospitalID <> 32

Essayez d'éviter les boucles avec SQL. Essayez plutôt de penser en termes d'ensembles.

12
John Saunders

Tout d'abord, je voudrais dire que je suis à 100% d'accord avec John Saunders sur le fait que vous devez éviter les boucles dans SQL dans la plupart des cas, en particulier dans la production.

Mais parfois, comme une seule fois pour remplir une table avec une centaine d'enregistrements à des fins de test à mon humble avis, c'est juste OK de vous faire plaisir à utiliser une boucle.

Par exemple, dans votre cas, pour remplir votre table avec des enregistrements avec des identifiants d'hôpital entre 16 et 100 et différencier les e-mails et les descriptions que vous auriez pu utiliser

CREATE PROCEDURE populateHospitals
AS
DECLARE @hid INT;
SET @hid=16;
WHILE @hid < 100
BEGIN 
    INSERT hospitals ([Hospital ID], Email, Description) 
    VALUES(@hid, 'user' + LTRIM(STR(@hid)) + '@mail.com', 'Sample Description' + LTRIM(STR(@hid))); 
    SET @hid = @hid + 1;
END

Et le résultat serait

ID   Hospital ID Email            Description          
---- ----------- ---------------- ---------------------
1    16          [email protected]  Sample Description16 
2    17          [email protected]  Sample Description17 
...                                                    
84   99          [email protected]  Sample Description99 
19
peterm