SQL to zupełnie inny język niż ten, do którego jesteś przyzwyczajony. Koncentruje się na czym , a nie jak . Powiedz SQL Serverowi, jakie wyniki chcesz, i pozwól mu dowiedzieć się, jak uzyskać odpowiedź. Lub, aby przeformułować to, co właśnie powiedziałem - w SQL nie ma pętli for.
Damien_The_Unbeliever
5
WHILE @I < 10; SET @I = @I + 1; BEGIN; ...; END? Nie należy tego jednak używać w przypadku większości przetwarzania zapytań (ale czasami jest to wymagane w przypadku manipulacji imperatywnej). Wiele takich instrukcji / wskazówek jest dostępnych w Google przy użyciu wyszukiwania „tsql for loop”.
7
Unikaj pętli na rzecz JOIN i ustaw operacje.
Oded
2
Jeśli nie jesteś ekspertem w SQL, nie powinieneś rozważać używania pętli. Jest tylko kilka warunków, w których jeden jest potrzebny i przez resztę czasu używanie pętli jest równoważne z pchaniem samochodu zamiast z nim prowadzeniem. Naucz się myśleć w kategoriach zestawów danych zamiast zapętlać rekordy. Pętla jest funkcją na poziomie eksperckim nie dlatego, że składnia jest trudna, ale dlatego, że musisz dokładnie wiedzieć, ile szkód możesz z nią zrobić, zanim będziesz mógł jej używać.
HLGEM,
2
Czasami można go użyć do szybkiego wyczarowania danych testowych w testowej bazie danych, którą i tak wkrótce usuniesz. W takim przypadku użycie tego eliminuje potrzebę przejścia przez osobny program napisany w czymś takim jak C #, a inżynieria nie jest szczególnie poważnym problemem. Znowu mówię to tylko w odniesieniu do danych testowych.
ŁĄCZENIA (i ustawiania operacji) powinny być preferowane nad konstrukcjami zapętlonymi w SQL.
Oded
6
Nie ma ograniczeń w stresowaniu (szczególnie dla tych, którzy są nowi w SQL), co powiedział Damien: „SQL jest bardzo innym językiem w porównaniu do tego, do czego jesteś przyzwyczajony. Skupia się na czym, a nie jak. Mówisz SQL Serverowi, co wyniki, które chcesz, i pozwól mu dowiedzieć się, jak uzyskać odpowiedź. ”
ypercubeᵀᴹ
1
Naprawdę ciekawe jest, że dokumentacja MS jest tutaj błędna. PODCZAS nie przyjmuje wyrażenia logicznego - wymaga predykatu - który oprócz możliwości oceny na PRAWDA lub FAŁSZ, może być również NIEZNANY.
Damien_The_Unbeliever
360
Nie ma pętli for, tylko pętla while:
DECLARE@i int =0WHILE@i <20BEGINSET@i =@i +1/* do some work */END
Należy zauważyć, że jeśli zamierzasz używać indeksu w pętli, możesz chcieć zwiększyć ostatnią rzecz zamiast pierwszej, w zależności od przypadku użycia.
jinglesthula
3
Należy również pamiętać, że domyślna wartość zmiennej lokalnej nie jest obsługiwana w zwykłym SQL. Dlatego SET @i = 0przedtem potrzebujesz osobnej pętli.
Nux
1
@Nux: 0 jest ustawiane podczas deklaracji jawnie
TcKs
7
Tak, ale to nie działa na starszych serwerach SQL (przynajmniej nie w 2005 roku).
Nux
Należy również zauważyć, że generalnie praca jest wykonywana przed zwiększeniem liczby całkowitej. Wiele pętli w SQL faktycznie używa tej liczby całkowitej w swojej pracy (iteracja od wiersza do wiersza lub wynik w tabelach temp) i może zostać odrzucona, jeśli przyrost nastąpi na początku cyklu, a nie na końcu.
CSS
34
Informacje dodatkowe
Aby dodać, ponieważ nikt nie opublikował odpowiedzi, która zawiera sposób iteracji w zbiorze danych wewnątrz pętli, można użyć słów kluczowych OFFSET FETCH .
Stosowanie
DECLARE@i INT =0;SELECT@count= Count(*)FROM{TABLE}WHILE@i <=@count
BEGINSELECT*FROM{TABLE}ORDERBY{COLUMN}
OFFSET @i ROWSFETCH NEXT 1ROWS ONLY
SET@i =@i +1;END
Witamy w Stack Overflow! Czy zastanowiłbyś się nad dodaniem narracji wyjaśniającej, dlaczego ten kod działa i co czyni go odpowiedzią na pytanie? Byłoby to bardzo pomocne dla osoby zadającej pytanie i każdej innej, która się pojawi.
Andrew Barber
18
To jest oczywiste.
Edward Olamisan,
4
Jak to się nie wyjaśnia? Miałem to samo pytanie, od razu zrozumiałem odpowiedź.
DanteTheSmith
1
Czym różni się ta odpowiedź od @TcK poza konwencją nazewnictwa?
Sushil Jadhav
7
Co powiesz na to:
BEGIN
Do Something
END
GO 10
... oczywiście możesz włożyć do niej przyrostowy licznik, jeśli musisz liczyć.
Pętla For nie jest jeszcze oficjalnie obsługiwana przez serwer SQL. Istnieje już odpowiedź na temat osiągania różnych sposobów FOR Loop. Szczegółowo przedstawiam odpowiedź na temat sposobów uzyskania różnych typów pętli w serwerze SQL.
Dla pętli
DECLARE@cnt INT =0;WHILE@cnt <10BEGINPRINT'Inside FOR LOOP';SET@cnt =@cnt +1;END;PRINT'Done FOR LOOP';
Jeśli wiesz, musisz mimo to wykonać pierwszą iterację pętli, możesz wypróbować DO..WHILE lub REPEAT..UNTIL wersję serwera SQL.
DO..HILE Loop
DECLARE@X INT=1;
WAY:--> Here the DO statementPRINT@X;SET@X +=1;IF@X<=10GOTO WAY;
REPEAT..UNTIL Pętla
DECLARE@X INT =1;
WAY:-- Here the REPEAT statementPRINT@X;SET@X +=1;
IFNOT(@X >10)GOTO WAY;
WHILE @I < 10; SET @I = @I + 1; BEGIN; ...; END
? Nie należy tego jednak używać w przypadku większości przetwarzania zapytań (ale czasami jest to wymagane w przypadku manipulacji imperatywnej). Wiele takich instrukcji / wskazówek jest dostępnych w Google przy użyciu wyszukiwania „tsql for loop”.Odpowiedzi:
T-SQL nie ma
FOR
pętli, maWHILE
pętlęWHILE (Transact-SQL)
źródło
Nie ma pętli for, tylko pętla while:
źródło
SET @i = 0
przedtem potrzebujesz osobnej pętli.Informacje dodatkowe
Aby dodać, ponieważ nikt nie opublikował odpowiedzi, która zawiera sposób iteracji w zbiorze danych wewnątrz pętli, można użyć słów kluczowych OFFSET FETCH .
Stosowanie
źródło
źródło
Co powiesz na to:
... oczywiście możesz włożyć do niej przyrostowy licznik, jeśli musisz liczyć.
źródło
Pętla For nie jest jeszcze oficjalnie obsługiwana przez serwer SQL. Istnieje już odpowiedź na temat osiągania różnych sposobów FOR Loop. Szczegółowo przedstawiam odpowiedź na temat sposobów uzyskania różnych typów pętli w serwerze SQL.
Dla pętli
Jeśli wiesz, musisz mimo to wykonać pierwszą iterację pętli, możesz wypróbować DO..WHILE lub REPEAT..UNTIL wersję serwera SQL.
DO..HILE Loop
REPEAT..UNTIL Pętla
Odniesienie
źródło
Prosta odpowiedź brzmi
NO !!
.PODCZAS :
IŚĆ DO :
Ja zawsze wolę
WHILE
nadGOTO
oświadczeniem.źródło
Podczas gdy przykład Pętli w języku T-SQL, który wyświetla datę początku i końca bieżącego miesiąca.
źródło
Wypróbuj, naucz się:
Z datą:
źródło