2013-03-03 12 views
6

Mam istniejące rekordy jakSQL Server 2008 Wstaw z pętli while

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

muszę użyć pętli while, aby wstawić wiersze z Hospital ID zmianie do określonej wartości lub 32, w tym przypadku, podczas gdy inni (nie ID, ponieważ jest generowany automatycznie) pozostające stałe.

Należy wtedy wyglądać

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 

Zawiadomienie powyższe ma teraz dwa nowe wiersze z ID i szpitala ID inna. Identyfikator jest generowany automatycznie.

Mam kilka tabel, w których muszę wykonać te same aktualizacje. Nie chcę używać kursora, jeśli mogę to zrobić z pętlą while.

EDYTOWANIE Opuszczony, podczas gdy pętla jako prostsze rozwiązanie zostało dostarczone w zaakceptowanej odpowiedzi.

+1

Próbowałeś już czegoś? – peterm

+0

Oczywiście. Nie wiem, jak napisać zapytanie wstawiania. Próbowałem deklarując @hospitalid int i pętlę z pętlą while z @@ RowCount. – Mukus

+0

Wpisz tutaj kod. – navi

Odpowiedz

12

Zakładając, że ID jest kolumna tożsamości:

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

Postaraj się unikać pętle z SQL. Spróbuj zamiast tego myśleć w kategoriach zestawów.

+0

To po prostu działa. Dziękuję Ci. Po prostu ciekawy, jak się uczyć, czy możesz wymyślić sposób, aby zrobić z WHILE LOOP? Czy oznaczałoby to utworzenie tabeli tymczasowej do przechowywania wartości temperatury? – Mukus

+3

Nigdy nie używałbym pętli 'WHILE'. Kiedy tylko znajduję swoje ja używając takiego kodu, zatrzymuję to, co robię i zaczynam od początku. –

19

Przede wszystkim chciałbym powiedzieć, że w 100% zgadzam się z Johnem Saunders, że należy unikać pętli w SQL w większości przypadków, szczególnie w produkcji.

Ale od czasu do czasu jako coś do wypełnienia tabeli z setkami rekordów do celów testowych, IMHO jest w porządku, aby pozwolić sobie na użycie pętli.

Na przykład w przypadku, aby wypełnić tabelę z ewidencji z identyfikatorami szpitalnych między 16 a 100 i sprawiają, e-maile i opisy odrębny można używałem

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 

I wynik byłby

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

Przyjęta nieco zmodyfikowana odpowiedź robi to, czego szukam. Nie próbowałem powiększyć HospitalID. Moje pytanie pokazuje przykład tego, co chciałem uzyskać. – Mukus

+0

@TejaswiRana Pytanie pokazuje przykład, ale nie jest za tym zamiarem. Możesz użyć wartości stałej dla HospitalID '32' w moim przykładzie, jeśli chcesz. Ale jeśli chcesz tylko powielić istniejący zestaw rekordów dokładnie tak, jak one są, zmieniając wartość jednej kolumny, to najlepszym rozwiązaniem jest rozwiązanie @JohnSaunders. – peterm

Powiązane problemy