AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Stored Procedure: Ergebnismenge dynamisch updaten
Thema durchsuchen
Ansicht
Themen-Optionen

Stored Procedure: Ergebnismenge dynamisch updaten

Ein Thema von quso · begonnen am 22. Dez 2006 · letzter Beitrag vom 23. Dez 2006
Antwort Antwort
quso

Registriert seit: 1. Okt 2005
Ort: Kleve
18 Beiträge
 
Turbo Delphi für Win32
 
#1

Stored Procedure: Ergebnismenge dynamisch updaten

  Alt 22. Dez 2006, 14:42
Datenbank: MSSQL • Version: 2000 • Zugriff über: Enterprise Manager
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).
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Stored Procedure: Ergebnismenge dynamisch updaten

  Alt 22. Dez 2006, 14:51
Hi,

so wird das wohl nicht gehen.

Versuchs mal damit
SQL-Code:
Update TableA
set ColumnName = <Value>
from TableA, TableB
Where <Bedingung>
Gruß
Norman
  Mit Zitat antworten Zitat
quso

Registriert seit: 1. Okt 2005
Ort: Kleve
18 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Stored Procedure: Ergebnismenge dynamisch updaten

  Alt 22. Dez 2006, 15:05
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.
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Stored Procedure: Ergebnismenge dynamisch updaten

  Alt 22. Dez 2006, 15:25
Hi,

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
Gruß
Norman
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Stored Procedure: Ergebnismenge dynamisch updaten

  Alt 22. Dez 2006, 15:31
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?
Gruß
Norman
  Mit Zitat antworten Zitat
quso

Registriert seit: 1. Okt 2005
Ort: Kleve
18 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Stored Procedure: Ergebnismenge dynamisch updaten

  Alt 22. Dez 2006, 15:55
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.
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Stored Procedure: Ergebnismenge dynamisch updaten

  Alt 22. Dez 2006, 16:32
Hi,

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 ...
Gruß
Norman
  Mit Zitat antworten Zitat
quso

Registriert seit: 1. Okt 2005
Ort: Kleve
18 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Stored Procedure: Ergebnismenge dynamisch updaten

  Alt 23. Dez 2006, 20:49
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
  Mit Zitat antworten Zitat
Benutzerbild von trifid
trifid

Registriert seit: 12. Sep 2003
297 Beiträge
 
#9

Re: Stored Procedure: Ergebnismenge dynamisch updaten

  Alt 23. Dez 2006, 21:38
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 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