Kursory w MS SQL

L9
  • Rejestracja:ponad 8 lat
  • Ostatnio:dzień
  • Lokalizacja:Kraków
  • Postów:129
0

Hej, mam pytanie o kursory w MS SQL, co to jest, do czego można ich użyć i czy warto?

ME
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 2 lata
  • Postów:105
1

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

edytowany 2x, ostatnio: Merano
somekind
Mnie się wydaje jednak, że bazy relacyjne działają w oparciu o relacje, nie kolumny.
ME
@somekind: Oczywiście, masz rację. Z tym że jedno nie wyklucza drugiego. Najłatwiej to chyba wytłumaczyć na przykładzie polecenia UPDATE. Nie przeszukujesz całych rekordów aby któryś z nich uaktualnić, tak jak to się dzieje w kursorze, lecz uaktualniasz wartość w jakiejś kolumnie, gdy wartość w innej kolumnie wynosi ileśtam. Owszem, docelowo na ekranie otrzymuje się wyświetlone rekordy, ale logika SQL-a jest oparta o działania na kolumnach a nie na wierszach.
PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 13 godzin
  • Postów:3874
0

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...

ML
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
  • Postów:858
0

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.

crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
1

przeciez kazdy kursor idzie zaminic na analogiczne rozwiazanie z while np

Kopiuj
 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

Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 13 godzin
  • Postów:3874
0
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 ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.