![]() |
Datenbank: MSSQL • Version: 2000 • Zugriff über: Enterprise Manager
Stored Procedure: Ergebnismenge dynamisch updaten
Wie muss eine SP definiert sein, die die einzelne Felder einer Ergebnismenge mit dem Ergebnis einer zweiten ändert.
Beispiel:
SQL-Code:
Geht das überhaupt mit einer Schleife? Bei Google habe ich leider nichts gefunden (zu MSSQL).
While (Select A,B from Tabelle where Bedingung) do
begin Update Tabelle set A = (Select X from View where B) ... end |
Re: Stored Procedure: Ergebnismenge dynamisch updaten
Hi,
so wird das wohl nicht gehen. Versuchs mal damit
SQL-Code:
Update TableA
set ColumnName = <Value> from TableA, TableB Where <Bedingung> |
Re: Stored Procedure: Ergebnismenge dynamisch updaten
Hallo NormanNG,
mein Beispiel soll verdeutlichen, dass der Wert, mit dem mein Feld A aktualisiert wird, keine Konstante ist und dass alle Datensätze der Abfrage so aktualisiert werden sollen. |
Re: Stored Procedure: Ergebnismenge dynamisch updaten
Hi,
Zitat:
Und aktualisiert werden *alle* Zeilen aus TableA, für die <Bedingung> gilt. Versuchs doch mal. Oder beschreib dein Problem etwas konkreter... /edit: Schreibfehler korrigiert |
Re: Stored Procedure: Ergebnismenge dynamisch updaten
Hi,
hier das Update mit deinem Beispiel
SQL-Code:
Evtl. wird's das damit klarer?
Update Tabelle
set A = X from Tabelle, View where View.B and Tabelle.Bedingung |
Re: Stored Procedure: Ergebnismenge dynamisch updaten
Hallo,
eines vorweg: Ich bin ein SQL-Neuling! So wie ich dein Beispiel verstehe, aktualisierst Du das Feld A mit dem Ergebnis aus dieser Abfrage: Zitat:
Beispiel Diese Ergebnismenge: A | B | ----------- 1 | U | 2 | V | 3 | W | 4 | X | 5 | Y | 5 | Z | z.B. auf diese Werte aktualisiert werden: A | B | ----------- 1 | A | 2 | B | 3 | C | 4 | D | 5 | F | 5 | G | Ich hoffe, das Bsp. verdeutlicht dies. |
Re: Stored Procedure: Ergebnismenge dynamisch updaten
Hi,
Zitat:
Also, entweder du hast einen Algorithmus, der die neuen Werte beschreibt, oder die neuen Werte liegen bereits in einer (anderen) Tabelle vor. Liegen die Werte in einer Tabelle vor, dann sind wir beim o.g. Beispiel (TabelleB). Gibt es eine Algorithmus, dann solltest du den nennen, dann kann ich dir evtl. helfen.... (hier sind wird beim *konkreter* werden). Wenn es keins von beidem ist, dann muss wohl jeder Datensatz einzeln aktualisiert werden? Nachtrag: Zitat:
Nochmal: Zitat:
|
Re: Stored Procedure: Ergebnismenge dynamisch updaten
Also von gaaanz von vorne:
U.a. über eine Web-Maske werden Datensätze in die DB geschrieben, die mittels einer Software verwaltet werden. (Es sind beides Fremdprodukte!) Um diese neuen Datensätze automatisch zu klassizieren (bzw. weitere Daten anzuhängen), soll die SP jeden Datensatz, welcher noch nicht klassifiziert ist, "bearbeiten". In einem View sind bereits alle zu bearbeiten Datensätze gefiltert und die Werte, welche in die "Haupttabelle" geschrieben werden sollen, angehängt. Ich muss also diese Werte eigentlich nur noch in die "Haupttabelle" zurückschreiben lassen. Soviel zu Umgebung. Das "eigentlich nur noch" stellt sich aber als schwierig heraus. Den Ablauf stelle ich mir so vor: - Abfrage des Views - Schleife: Mit jedem erhalten Datensatz die "Haupttabelle" aktualisieren. Mein erster Ansatz sieht so aus: Haupttabelle, bevor die SP ausgeführt wurde: A | B | ----------- 1 | U | 2 | V | 3 | W | 4 | X | 5 | Y | 6 | Z | .... Die SP: Zitat:
A | B | ----------- 1 | A | 2 | B | 3 | C | 4 | D | 5 | F | 6 | G | ... [Um Missverständnissen vorzubeugen: Nicht alle Datensätze müssen geändert werden! ] Mein Problem ist die Schleife. In PHP würde ich mit "foreach" die Ergebnismenge durchgehen. Wie macht man dies im MSSQL-Server? Ach ja: Zitat:
|
Re: Stored Procedure: Ergebnismenge dynamisch updaten
Hallo quso,
Leider unterstützt der MSSQL nicht die Dynamik in TSQL, die man sich wünschen möchte Ein Ansatz wäre:
SQL-Code:
Oder: mit einem CURSOR
Update Tabelle set A = (Select X
from View where B IN (Select B from Tabelle where Bedingung) )
SQL-Code:
Ich bin mir nicht sicher das der Code 100%-ig richtig ist, da ich ihn nicht getestet habe!
DECLARE @a int
DECLARE @b char(10) DECLARE cr CURSOR FOR Select A,B from Tabelle where Bedingung OPEN cr FETCH NEXT FROM cr INTO @a, @b WHILE (@@FETCH_STATUS = 0) BEGIN Update Tabelle set A = (Select X from View where @b) FETCH NEXT FROM cr INTO @a, @b END CLOSE cr DEALLOCATE cr Aber der Ablauf könnte so aussehen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz