Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Iteruj przez wiersze w SQL Server 2008

Jeśli musisz iterate(*), użyj konstrukcji zaprojektowanej do tego celu — kursor . Bardzo oczerniany, ale jeśli najdobitniej wyraża twoje intencje, mówię, użyj go:

DECLARE @ID int
DECLARE IDs CURSOR LOCAL FOR select ID from SAMPLE where Name = @NameParameter

OPEN IDs
FETCH NEXT FROM IDs into @ID
WHILE @@FETCH_STATUS = 0
BEGIN
    exec myproc @ID

    FETCH NEXT FROM IDs into @ID
END

CLOSE IDs
DEALLOCATE IDs

(*) Ta odpowiedź otrzymała ostatnio kilka głosów za, ale uważam, że powinienem zamieścić tutaj również mój oryginalny komentarz i dodać kilka ogólnych rad:

W SQL należy ogólnie szukaj rozwiązania opartego na zbiorze. Cały język jest zorientowany na rozwiązania oparte na zbiorach, a (z kolei) optymalizator jest zorientowany na sprawienie, aby rozwiązania oparte na zbiorach działały dobrze. Z kolei dostępne narzędzia do dostrajania optymalizator jest również zorientowany na zbiór - np. stosowanie indeksów do tabel.

Jest kilka sytuacje, w których najlepszym podejściem jest iteracja. Niewiele z nich jest daleko i można je porównać do zasad Jacksona dotyczących optymalizacji – nie rób tego – i (tylko dla ekspertów) nie rób tego jeszcze .

O wiele lepiej jest, jeśli najpierw spróbujesz sformułować to, czego chcesz w odniesieniu do zestawu wszystkich wierszy, na które ma to mieć wpływ – jaka jest ogólna zmiana, którą należy osiągnąć? - a następnie spróbuj sformułować zapytanie, które zawiera ten cel. Tylko jeśli zapytanie utworzone w ten sposób nie działa odpowiednio (lub istnieje jakiś inny składnik, który nie jest w stanie zrobić niczego innego niż radzenie sobie z każdym wierszem osobno), powinieneś rozważyć iteracja.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego usługi SSIS nie rozpoznają ogranicznika wiersza {LF} podczas importowania zwykłego pliku UTF-8?

  2. Każde wyrażenie GROUP BY musi zawierać co najmniej jedną kolumnę, która nie jest odnośnikiem zewnętrznym

  3. Błąd konwersji danych zbiorczego ładowania (niezgodność typu lub nieprawidłowy znak dla określonej strony kodowej) dla wiersza 1, kolumny 4 (rok)

  4. Jak śledzić liczbę zmian zachodzących w kolumnie? T-SQL - Serwer SQL

  5. SQL Server, gdzie klauzula między dwiema datami nie daje oczekiwanych wyników