2013-03-03 9 views
6

Ich habe vorhandene Datensätze wieSQL Server 2008 Einfügen mit While-Schleife

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

Ich brauche eine While-Schleife verwenden, um Zeilen einfügen mit Krankenhaus-ID auf einen bestimmten Wert zu ändern oder 32 in diesem Fall, während der andere (ID nicht wie es automatisch generiert wird) konstant bleiben.

Es sollte dann folgendermaßen aussehen

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 

Beachten Sie die oben jetzt zwei neue Reihen mit ID und Krankenhaus-ID unterschiedlich ist. ID wird automatisch generiert.

Ich habe mehrere Tabellen, wo ich die gleichen Updates machen muss. Ich möchte den Cursor nicht verwenden, wenn ich das mit einer while-Schleife machen kann.

BEARBEITEN Verlassene while-Schleife als eine einfachere Lösung wurde in der angenommenen Antwort zur Verfügung gestellt.

+1

Hast du schon etwas probiert? – peterm

+0

Natürlich. Ich weiß nicht, wie man die Einfügeabfrage schreibt. Ich habe versucht, @hospitalid int und die Schleife mit while-Schleife mit @@ RowCount zu deklarieren. – Mukus

+0

Geben Sie hier einen Code ein. – navi

Antwort

12

Unter der Annahme, dass ID ist eine Identitätsspalte:

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

Try Schleifen mit SQL zu vermeiden. Versuchen Sie stattdessen, in Sätzen zu denken.

+0

Das funktioniert einfach. Vielen Dank. Nur neugierig zu lernen, können Sie sich einen Weg mit WHILE LOOP vorstellen? würde das bedeuten, eine temporäre Tabelle zu erstellen, um temporäre Werte zu speichern? – Mukus

+3

Ich würde niemals eine 'WHILE'-Schleife verwenden. Immer wenn ich mich selbst mit Code wie diesem finde, höre ich auf, was ich gerade mache, und fange neu an. –

19

Zunächst möchte ich sagen, dass ich 100% zustimme mit John Saunders, dass man Schleifen in SQL in den meisten Fällen vermeiden muss, besonders in der Produktion.

Aber gelegentlich als eine einmalige Sache, um eine Tabelle mit hundert Datensätzen zu Testzwecken zu bevölkern IMHO ist es nur OK, sich hingeben, um eine Schleife zu verwenden.

Zum Beispiel in Ihrem Fall Ihre Tabelle mit Datensatz mit Krankenhaus-IDs zwischen 16 und 100 zu füllen und E-Mail und Beschreibungen deutlich machen Sie

verwendet haben könnten, wäre
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 

und Ergebnis

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

Die akzeptierte Antwort leicht modifiziert tut was ich suche. Ich habe nicht versucht, die HospitalID zu erhöhen. Meine Frage zeigt das Beispiel dessen, wonach ich suchte. – Mukus

+0

@TejaswiRana Die Frage zeigt Beispiel, aber nicht Absicht dahinter. Sie können const Wert für HospitalID '32' in meinem Beispiel verwenden, wenn Sie möchten. Wenn Sie jedoch vorhandene Datensätze genau so ändern möchten, wie sie sind, während Sie den Wert einer Spalte ändern, ist die Lösung von @JohnSaunders der beste Weg. – peterm