Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Stored Procedure: Ergebnismenge dynamisch updaten (https://www.delphipraxis.net/82939-stored-procedure-ergebnismenge-dynamisch-updaten.html)

quso 22. Dez 2006 13:42

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:
While (Select A,B from Tabelle where Bedingung) do
begin
Update Tabelle set A = (Select X from View where B)
...
end
Geht das überhaupt mit einer Schleife? Bei Google habe ich leider nichts gefunden (zu MSSQL).

NormanNG 22. Dez 2006 13:51

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>

quso 22. Dez 2006 14:05

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.

NormanNG 22. Dez 2006 14:25

Re: Stored Procedure: Ergebnismenge dynamisch updaten
 
Hi,

Zitat:

Zitat von quso
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.

genau das macht der obige Update-Befehl. <value> steht hier für *irgendeinen* Wert, also z.B. auch etwas aus TableB...
Und aktualisiert werden *alle* Zeilen aus TableA, für die <Bedingung> gilt.


Versuchs doch mal. Oder beschreib dein Problem etwas konkreter...

/edit: Schreibfehler korrigiert

NormanNG 22. Dez 2006 14:31

Re: Stored Procedure: Ergebnismenge dynamisch updaten
 
Hi,

hier das Update mit deinem Beispiel

SQL-Code:
Update Tabelle
  set A = X
from Tabelle, View
where View.B
and Tabelle.Bedingung
Evtl. wird's das damit klarer?

quso 22. Dez 2006 14:55

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:

from Tabelle, View
where View.B
and Tabelle.Bedingung
Es sollen allerdings nicht alle Felder mit einem Wert aktualisiert werden, sondern jedes Feld bekommt (u. U.) einen anderen Wert.

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.

NormanNG 22. Dez 2006 15:32

Re: Stored Procedure: Ergebnismenge dynamisch updaten
 
Hi,

Zitat:

Zitat von quso
Ich hoffe, das Bsp. verdeutlicht dies.

Jein ;-) Aus dem Beispiel ist die Abhängigkeit von A/altB zu A/neuB nicht zu erkennen.

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:

So wie ich dein Beispiel verstehe, aktualisierst Du das Feld A mit dem Ergebnis aus dieser Abfrage
Ja, aber jeder Zeile auf A enthält - abhängig von View - eine anderen Wert (eben aus View). Es werden *nicht* alle Zeile von A mit dem gleichen Wert aktualisiert!

Nochmal:
Zitat:

Versuchs doch mal.
evtl. mit vereinfachten Beispieldaten ...

quso 23. Dez 2006 19:49

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:

SQL-Code:
While (Select A,B from Tabelle where Bedingung) do
begin
Update Tabelle set A = (Select X from View where B)
...
end

Haupttabelle, nachdem die SP ausgeführt ist:

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:

Nochmal:
Zitat:

Versuchs doch mal.
evtl. mit vereinfachten Beispieldaten ...
Ich habe es probiert, aber leider besteht das Script den Syntax-Check im Enterprise Manager nicht. Selbst verständlich mit richtigen Tabellen-, Spaltennamen. Davon abgesehen, sehe ich nicht, wie dein Beispiel das Problem lösen soll. Oder bin ich nur zu blöd :?::?::?:

trifid 23. Dez 2006 20:38

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:
Update Tabelle set A = (Select X
                        from View
                        where B IN (Select B
                                    from Tabelle
                                    where Bedingung)
                        )
Oder: mit einem CURSOR
SQL-Code:
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
Ich bin mir nicht sicher das der Code 100%-ig richtig ist, da ich ihn nicht getestet habe!
Aber der Ablauf könnte so aussehen


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz