Laden...

Schleifen

Erstellt von mercuer vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.993 Views
M
mercuer Themenstarter:in
79 Beiträge seit 2006
vor 16 Jahren
Schleifen

verwendetes Datenbanksystem: <MS SQL Server 2005>

Hallo zusammen!

Habe eigentlich keine Ahnung von SQL, muss jetzt aber in den sauren Apfel beissen und ein Update Script für ein Datenbank machen.

Dazu muss ich eine Spalte kopieren und dann Werte aus einer anderen Spalte hinein kopieren. Gibt es sowas wie eine foreach schleife mit der ich ein paar Befehle für jeden Datensatz in der Tabelle wiederholen kann?

3.511 Beiträge seit 2005
vor 16 Jahren

Nein, sowas gibt es im SQL Server nicht.

Du kannst aber einen CURSOR benutzen um durch ein SELECT zu iterieren. Cursor sind aber verdammt langsam und sollten nicht benutzt werden.
In fast allen Fällen, kann man aber ein Cursor durch ein gut aufgebautes SQL Statement ersetzen.

[Edit] Das "Nein" bezieht sich auf das foreach.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

J
3.331 Beiträge seit 2006
vor 16 Jahren

Original von mercuer
Dazu muss ich eine Spalte kopieren und dann Werte aus einer anderen Spalte hinein kopieren. Gibt es sowas wie eine foreach schleife mit der ich ein paar Befehle für jeden Datensatz in der Tabelle wiederholen kann?

Ja, es gibt so eine Schleife.* Die benötigst Du aber gar nicht, weil Operationen in einer Datenbank in aller Regel auf einer Datenmenge ausgeführt werden, also auf allen Datensätzen, die der WHERE-Bedingung entsprechen.

Beispiel, in dem der Ortszusatz in ein eigenes Feld eingetragen wird und vom Ortsnamen entfernt wird:

ALTER TABLE Adress ADD Zusatz VARCHAR(35);
/* danach */
UPDATE Adress
  SET Zusatz = SUBSTR(Ort, 8, 35),
      Ort = SUBSTR(Ort, 1, 6)
  WHERE Ort LIKE 'Berlin-%';

Bei SQL lautet die Implementation für die groß geschriebenen Begriffe vielleicht ein wenig anders; aber grundsätzlich geht es in dieser Art.

Viel Erfolg! Jürgen

* Nachtrag: Bei Firebird gibt es FOR DO... for StoredProcedures oder WHEN. Ich hatte angenommen, dass es so etwas auch für MS-SQL gibt. Aber, wie gesagt, das benötigt man bei der Aufgabenstellung höchstwahrscheinlich nicht.

M
mercuer Themenstarter:in
79 Beiträge seit 2006
vor 16 Jahren

@juetho:

Danke für deinen Vorschlag, ich wollte es ziemlich genauso machen wie du beschrieben hast, aber leider ist die neue Spalte ein IDENTITY Feld, welches den Wert in Zukunft automatisch erhöhen soll. Und dieses Feld kann man anscheinend nicht updaten. Nun lege ich eine neue Tabelle mit dem neuen Feld an und mache einen INSERT aller Daten aus der alten Tabelle in die neue Tabelle, denn mit INSERT kann man auch beliebige Werte in das IDENTITY Feld schreiben, ich vertehe zwar nicht warum es mit UPDATE nicht geht aber nah gut, soll ja nicht das Problem sein. Nun möchte ich noch die alte Tabelle löschen und dann die neue Tabelle umbenennen, damit Sie an deren Stelle tritt. Da habe ich noch ein kleines Problem. Ich kann die Tabelle nicht löschen, solange ein Foreign key diese Tabelle Referenziert. Kann ich diese Beziehung entfernen und nach dem löschen der alten Tabelle wieder hinzufügen?

J
3.331 Beiträge seit 2006
vor 16 Jahren

Tja, so ist das mit vollständiger Beschreibung des Problems. (Ich musste gestern bei einem eigenen Problem auch mehrfach Informationen nachliefern...) Ein IDENTITY Feld ist zwangsläufig etwas Besonderes.

Warum dieses Feld nicht einfach hinzugefügt und per UPDATE gefüllt werden kann, weiß ich nicht (dafür gibt es MS-Spezialisten). Ich könnte mir vorstellen, dass ein solches Feld automatisch den PrimaryKey erhält; und der ist vielleicht schon festgelegt, müsste also geändert werden. Deshalb ist der Umweg über eine neue Tabelle zwangsläufig.

ForeignKeys/Referenzen können (vor allem für solche Zwecke) beliebig gelöscht und später wieder aktiviert werden. Sie prüfen den jeweils aktuellen Datenbestand; und wenn sich in der "referenziellen Integrität" nichts ändert, führt dies auch nie zu Problemen.

Gruß Jürgen

M
mercuer Themenstarter:in
79 Beiträge seit 2006
vor 16 Jahren

Nochmal ein Problemchen. Wollte jetzt gerade noch den Startwert der Identity Spalte verändern. laut Dokus und verschiedenen Einträgen in diversen Foren sollte das so funktionieren:

ALTER TABLE MyTable ALTER COLUMN MyNumber IDENTITY (10, 2)

bekomme aber immer diese Fehlermeldung:

Falsche Syntax in der Nähe des 'IDENTITY'-Schlüsselwortes.

Hat jemand eine Ahnung wo das Problem liegt??

103 Beiträge seit 2006
vor 16 Jahren

Probier mal 'IDENTITY' oder [IDENTITY] ... bin grad ein wenig verwirrt.

edit: das hat man nun davon, wenn man zu faul ist es selbst auszuprobieren. 😉

OUT! OUT! You demons of stupidity!
-Dogbert

M
mercuer Themenstarter:in
79 Beiträge seit 2006
vor 16 Jahren

Ne also das bringt nix...

C
42 Beiträge seit 2007
vor 16 Jahren

Das ist doch das hier:
http://www.houseoffusion.com/groups/sql/thread.cfm/threadid:564
How do I alter a column that is an int so that it is also an identity? I
can't delete the column as it's an upsized access database so I need to
keep the numbers that are there.

Mit SET IDENTITY_INSERT ON kann man selber einen Wert in eine IDENTITY Spalte einfügen. Ja, FK-Referenz kann man löschen und hinzufügen.

zu ALTER TABLE:
The altered column cannot be
...
Used in a PRIMARY KEY or [FOREIGN KEY] REFERENCES constraint.
...

M
mercuer Themenstarter:in
79 Beiträge seit 2006
vor 16 Jahren

Naja das mit Identity Spalten erzeugen und Werte einfüllen ist eigentlich nicht mehr das Problem. Es geht mir jetzt eigentlich nur noch darum den Startwert für das automatische hochzählen zu verändern. Das sollte doch möglich sein.

R
42 Beiträge seit 2006
vor 16 Jahren
  • sorry - wollte eigentlich einen Thread erstellen. Beitrag kann gelöscht werden