Staram się osiągnąć coś w stylu for-each, w którym chciałbym wziąć identyfikatory zwróconej instrukcji select i użyć każdego z nich.
DECLARE @i int
DECLARE @PractitionerId int
DECLARE @numrows int
DECLARE @Practitioner TABLE (
idx smallint Primary Key IDENTITY(1,1)
, PractitionerId int
)
INSERT @Practitioner
SELECT distinct PractitionerId FROM Practitioner
SET @i = 1
SET @numrows = (SELECT COUNT(*) FROM Practitioner)
IF @numrows > 0
WHILE (@i <= (SELECT MAX(idx) FROM Practitioner))
BEGIN
SET @PractitionerId = (SELECT PractitionerId FROM @Practitioner WHERE idx = @i)
--Do something with Id here
PRINT @PractitionerId
SET @i = @i + 1
END
W tej chwili mam coś, co wygląda jak wyżej, ale pojawia się błąd:
Nieprawidłowa nazwa kolumny „idx”.
Mógłby ktoś
sql-server
tsql
Pomster
źródło
źródło
idx
jest w@Practitioner
niePractitioner
. Najczęściej istnieją lepsze, oparte na zestawach alternatywy dla podejścia dla każdego, jeśli pokażesz, co robisz z wartością wiersza, być może można zaproponować alternatywę.--Do something with Id here
to jest, prawdopodobnie możemy pokazać Ci, jak rozwiązać ten problem bez żadnych pętli ani kursorów. W większości przypadków chcesz użyć rozwiązania opartego na zestawie, ponieważ w ten sposób SQL Server jest zoptymalizowany do pracy. Pętla i leczenie pojedynczych rzędów z pewnością ma swoje miejsce, ale podejrzewam, że to nie to.Odpowiedzi:
Wygląda na to, że chcesz użyć
CURSOR
. Chociaż w większości przypadków najlepiej jest zastosować rozwiązanie oparte na zestawie, w niektórych przypadkachCURSOR
najlepszym rozwiązaniem jest a. Nie wiedząc więcej o twoim prawdziwym problemie, nie możemy pomóc ci więcej niż to:źródło
Załóżmy, że kolumna PractitionerId jest unikalna, możesz użyć następującej pętli
źródło
Wybrana liczba i wybierz maksimum powinny pochodzić ze zmiennej tabeli zamiast z rzeczywistej tabeli
źródło
To ogólnie (prawie zawsze) działa lepiej niż kursor i jest prostsze:
źródło
Powiedziałbym, że wszystko prawdopodobnie działa, z wyjątkiem tego, że kolumna
idx
tak naprawdę nie istnieje w tabeli, z której wybierasz. Może chciałeś wybrać z@Practitioner
:ponieważ jest to zdefiniowane w powyższym kodzie w ten sposób:
źródło
W twojej wersji nieprawidłowy jest następujący wiersz:
(Brakuje @)
Być może warto zmienić konwencję nazewnictwa, aby tabele były bardziej różne.
źródło
Chociaż kursory zwykle uważane są za okropne zło, uważam, że jest to przypadek kursora FAST_FORWARD - najbliższa rzecz, jaką można uzyskać w FOREACH w TSQL.
źródło
Wykonałem procedurę wykonującą za
FOREACH
pomocąCURSOR
dla dowolnej tabeli.Przykład zastosowania:
Wynik to 2 selekcje dla każdego wiersza. Składnia
UPDATE
i łamanieFOREACH
są zapisane w podpowiedziach.To jest kod proc:
źródło
Wymyśliłem bardzo skuteczny (myślę) czytelny sposób na zrobienie tego.
Oto kod. Przepraszamy, używa moich nazw zmiennych zamiast tych z pytania.
źródło
Oto jedno z lepszych rozwiązań.
Możemy uzyskać dostęp lub możemy zrobić cokolwiek w treści pętli i możemy uzyskać dostęp do idx poprzez zdefiniowanie go w definicji tabeli.
źródło