Führen Sie SQL Server-Funktion für jede Zeile in der Tabelle
Ich habe eine Funktion, die iteriert "für jede Zeile" in der Tabelle. Wenn es ausgeführt wird, es sollte in jeder Zeile, ziehen Sie die zugehörigen Werte für die Zeile und führen die Funktion aus, die in Kurven, gibt ein Ergebnis zurück und aktualisiert die richtige Zeile mit dem richtigen Wert. Was geschieht, ist, dass es ausgeführt wird, und die Rückgabe der Wert der letzten Zeile und aktualisiert die Zeile mit diesem Wert. Irgendwelche Ideen was ich falsch mache?
SELECT
RowNum = ROW_NUMBER() OVER(ORDER BY ID)
,*
INTO #Geo
FROM DDDG
DECLARE @MaxRownum INT
SET @MaxRownum = (SELECT MAX(RowNum) FROM #Geo)
DECLARE @Iter INT
SET @Iter = (SELECT MIN(RowNum) FROM #Geo)
WHILE @Iter <= @MaxRownum
BEGIN
SELECT *
FROM #Geo
WHERE RowNum = @Iter
DECLARE @address nvarchar (100);
Select @address = Ad1 from DDDG where id = @Iter;
DECLARE @state nvarchar (100);
SET @state = 'FL';
DECLARE @zip nvarchar (100);
SET @zip = '33142';
DECLARE @city nvarchar (100);
SET @city = 'Miami';
DECLARE @nation nvarchar (2);
SET @nation = 'us';
DECLARE @g geography;
WAITFOR DELAY '00:00:00.050'
SET @g = dbo.Geocode(@nation, @state, @city, @zip, @address);
Update DDDG
Set Lat = @g.Lat
where id = @Iter;
Update DDDG
Set long = @g.Long
where id = @Iter;
SET @Iter = @Iter + 1
END
DROP TABLE #Geo
Update .....
danke an alle... mich hat es fast funktioniert.. Nach eine Hölle der eine Menge von Versuch und Irrtum habe ich herausgefunden, dass ich brauchte, um zu ändern Sie die folgenden
Update DDDG Set Lat = @g.Lat where id = id;
Update DDDG Set long = @g.Long where id = id;
Ich habe nur ein problem jetzt. Wenn ich die Zeilen löschen die RowNum-und die @Iter nicht mehr überein. gibt es eine Möglichkeit, dies zu beheben problem andere als die Neuerstellung der Tabelle jedes mal?
- Sollten Sie überarbeiten die Logik zu beseitigen die Schleife...SQL ist eine set-basierte Sprache und führt sehr schlecht wie diese. Es Griffe viel besser, wenn Sie Locker die lineare Linie des Denkens, ein Skript zu aktualisieren, werden alle Zeilen, keine Schleife.
- Sind Sie sicher, dass der Geocode-Funktion nicht einfach wieder die gleiche Breite und Länge für jede Adresse?
- Ich bin sicher, (Dr. Wily Frage)und da für einen besseren Weg habe ich auf diese für nur 6 Monate oder so.. wenn Sie mir zeigen, einen besseren Weg.... im all für Sie
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geänderte Abfrage nach immer downvotes von Kollegen für das oben genannte:
Ich würde Zustimmen, dass die CROSS APPLY-ist eine bessere Lösung als würde es Sie rufen die Funktion einmal pro Zeile.
Ad1
, so sollte es eine Fehlermeldung zu geben. Und warum würden Sie brauchen, um machen einenJOIN
mit sich selbst, es ist viel viel mehr einfach nur update der TabelleWHERE d.id = ID
ist Total überflüssig...id = ID
warf mich ab und ich nahm an, es war einJOIN
dbo.GeoCode('us','FL','Miami','33142',Ad1).Lat
Ich kann etwas fehlt, aber warum brauchen Sie eine Schleife um alle?:
Ist es auch möglich zur Verbesserung die Abfrage weiter reduzieren die Anzahl der Anrufe zu
dbo.GeoCode
nur einen pro Zeile:WHERE
Bedingung in der Frage, und op ist das Durchlaufen der gesamten Tabellewhere id = @Iter
in der Abfrage.WHERE