Ich versuche, etwas in der Art eines For-Each zu erreichen, wobei ich die IDs einer zurückgegebenen select-Anweisung nehmen und jede von ihnen verwenden möchte.
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
Im Moment habe ich etwas, das wie oben aussieht, aber ich bekomme den Fehler:
Ungültiger Spaltenname 'idx'.
Könnte jemand
sql-server
tsql
Pomster
quelle
quelle
idx
ist in@Practitioner
nichtPractitioner
. Es gibt meistens überlegene satzbasierte Alternativen zu einem Ansatz für jeden Ansatz. Wenn Sie zeigen, was Sie mit dem Zeilenwert tun, kann möglicherweise eine Alternative vorgeschlagen werden.--Do something with Id here
ist, können wir Ihnen wahrscheinlich zeigen, wie Sie dieses Problem ohne Schleifen oder Cursor lösen können. In den meisten Fällen möchten Sie eine satzbasierte Lösung verwenden, da SQL Server auf diese Weise für die Funktionsweise optimiert ist. Das Schleifen und Behandeln einer Reihe nach der anderen hat sicherlich seinen Platz, aber ich vermute, dass dies nicht der Fall ist.Antworten:
Sie scheinen eine verwenden zu wollen
CURSOR
. Obwohl es in den meisten Fällen am besten ist, eine satzbasierte Lösung zu verwenden, gibt es manchmal Fälle, in denen aCURSOR
die beste Lösung ist. Ohne mehr über Ihr eigentliches Problem zu wissen, können wir Ihnen nicht mehr helfen:quelle
Angenommen, die Spalte PractitionerId ist eindeutig, dann können Sie die folgende Schleife verwenden
quelle
Ihre Auswahlanzahl und Auswahlmaximum sollten aus Ihrer Tabellenvariablen anstelle der tatsächlichen Tabelle stammen
quelle
Dies ist im Allgemeinen (fast immer) besser als ein Cursor und einfacher:
quelle
Ich würde sagen, dass wahrscheinlich alles funktioniert, außer dass die Spalte
idx
in der Tabelle, aus der Sie auswählen, nicht vorhanden ist. Vielleicht wollten Sie auswählen aus@Practitioner
:weil das im obigen Code so definiert ist:
quelle
Die folgende Zeile ist in Ihrer Version falsch:
(Das @ fehlt)
Möglicherweise sollten Sie Ihre Namenskonvention so ändern, dass die Tabellen unterschiedlicher sind.
quelle
Obwohl Cursor normalerweise als schrecklich böse angesehen werden, glaube ich, dass dies ein Fall für den FAST_FORWARD-Cursor ist - das, was Sie FOREACH in TSQL am nächsten bringen können.
quelle
Ich habe mir einen sehr effektiven (meiner Meinung nach) lesbaren Weg ausgedacht, dies zu tun.
Hier ist der Code. Entschuldigung, es werden meine Variablennamen anstelle der in der Frage angegebenen verwendet.
quelle
Hier ist die eine der besseren Lösungen.
Wir können auf den Hauptteil der Schleife zugreifen oder alles tun, und wir können auf den IDX zugreifen, indem wir ihn in der Tabellendefinition definieren.
quelle
Ich habe eine Prozedur erstellt, die ein
FOREACH
withCURSOR
für jede Tabelle ausführt .Anwendungsbeispiel:
Das Ergebnis sind 2 Auswahlen für jede Zeile. Die Syntax von
UPDATE
und break theFOREACH
sind in den Hinweisen geschrieben.Dies ist der Proc-Code:
quelle