Hej, mam pytanie o kursory w MS SQL, co to jest, do czego można ich użyć i czy warto?
Jak nie trzeba, to lepiej ich nie używać, chociażby ze względów wydajnościowych. Kursory są powolne. Poza tym działają w oparciu o logikę trochę niezgodną z ideą zbiorów i baz relacyjnych. Działają na wierszach, a logika baz relacyjnych jest oparta na działaniu na kolumnach.
Tu jest zbiór linków o kursorach, z pewnością pomogą Ci w ich zrozumieniu:
http://grodzicki.eu/kursory-dlaczego-tak-je-lubimy-i-dlaczego-ich-lepiej-nie-uzywajmy/
http://grodzicki.eu/abc-kursor-ow-w-sql-server/
https://edux.pjwstk.edu.pl/mat/118/lec/w13.html
http://dev.cdur.pl/Artykuly/Kursory-w-SQL-Server
Warto znać, choćby po to żeby wiedzieć co się dzieje, jak dostaniesz kod z użytym kursorem.
Moje podejście jest takie, że za użycie kursora obcinam ręce ;) Nie spotkałem się jeszcze z przypadkiem aby użycie kursora było podyktowane faktyczna niemożliwością rozwiązania problemu bez niego...
Tylko czasem użycie kursora upraszcza i ułatwia czytanie kodu. Jeżeli w danym miejscu wydajność nie jest kluczowa albo mamy mało danych to lepiej użyć kursora niż jakieś karkołomne zapytanie. Po jakimś czasie przynajmniej można szybko dojść o co chodzi a nie zastanawiać się co ten dziwny kod robi.
przeciez kazdy kursor idzie zaminic na analogiczne rozwiazanie z while np
select
Id = identity(int, 1, 1),
*
into
#data
from
Tabela
declare @Index1 int;
declare @Index2 int;
select @index1 = min(Id), @Index2 = max(Id) from #data
while @Index1 <= @Index2
begin
// kod z triggera
@Index1 += 1;
end
crowa napisał(a):
przeciez kazdy kursor idzie zaminic na analogiczne rozwiazanie z while np
Pytanie tylko po co zamieniać? I w ogóle po co używać kursorów?
Rozumiem jeszcze pętle do wykonywania operacji nie związanymi bezpośrednio z operacjami na danych np. procedury do backupowania, reindeksacji czy inny szeroko rozumiany maintance...
Ale znajdź mi jeden przykład, że czegoś nie da się zrobić na danych bez kursora... Mi się nie udało. Podejmę rękawice, taki challange ;)