Entwickler-Ecke

Datenbanken - [SQL] Spaltenname aus variable generieren


Der Jan - Fr 16.12.05 15:44
Titel: [SQL] Spaltenname aus variable generieren
Hallo,

diese Frage hat ziemlich direkt mit diesem Thread http://www.delphi-forum.de/viewtopic.php?t=53171&start=0&postdays=0&postorder=asc&highlight= von mir zu tun...

Wie kann ich den Name einer Spalte aus einer Variablen generieren? Es geht darum das ich in einer Tabelle eine Menge Spalten anlegen muß, die alle ähnlich heißen, also möchte ich das ganze in eine Procedure packen:


SQL-Anweisung
1:
2:
3:
4:
5:
CREATE TABLE RATEN_NEU(
  ID: INT,
  BEGINN: DATE,
  ENDE: DATE
)


Jetzt wird eine Schleife durchlaufen und in dieser zähle ich eine Variable "I" hoch und würde dann gerne etwas schreiben wie:


SQL-Anweisung
1:
ALTER TABLE RATEN_NEU ADD (Rate + I) NUMERIC 15,2                    


So das die Spalten dann heißen Rate1, Rate2 usw.

Geht das bzw. wie ist der Syntax dafür?


alzaimar - Fr 16.12.05 16:04

Du musst Dir den SQL-Befehl als String zusammenbasteln und dann an den Server übertragen. Ich kenne die Syntax nicht genau, aber ich mache das immer so (weil ich faul bin):
Du hast bestimmt eine Art Profiler oder einen SQL-Monitor, der alles aufzeichnet, was an SQL-Befehlen zum Server geht.

Daneben hast Du bestimmt ein Admin-Tool für deinen Server, mit dem man Tabellen anlegen kann.

Lege eine Tabelle an und schaue in den SQL-Monitor.
Füge eine Spalte hinzu und schau nochmal hin.

Nun weist du, wie der SQL-Befehl aussehen muss.


Der Jan - Fr 16.12.05 16:11

Ähm, nee...

Ich weiss ja, wie der Befehl auszusehen hat. Es geht darum, daß der Spaltenname in jedem Schleifendurchlauf geändert wird. Es müssen paar hundert spalten angelegt werden und ich bin zu faul, das alles manuell zu machen.

Wie kann ich denn einen zusammengebauten Befehl (der ja dann irgendwo in einer Variablen stehen muß) direkt an den Server schicken?


UGrohne - Fr 16.12.05 19:24

Welche Datenbank verwendest Du denn? Seit Version 1.5 kann Firebird Strings als SQL ausführen. Du baust den String also in einer Procedure zusammen und führst den String glaube mit  EXECUTE STATEMENT 'String';.
Ich glaube, die Syntax stimmt gerade nicht, hab das mal in einer Entwickler-Ausgabe gelesen, ich schau grad mal nach.

//EDIT: Habs gefunden, es war EXECUTE STATEMENT


Lake - Fr 16.12.05 19:34

setze doch einen String zusammen, den Du dann an die TQuery übergibst. Vorher kannst Du prüfen ob das Feld schon existiert.


Delphi-Quelltext
1:
sSQL := concat('ALTER TABLE RATEN_NEU ADD Rate',IntToStr(I),' NUMERIC 15,2');                    


Robert.Wachtel - Fr 16.12.05 19:41
Titel: Re: [SQL] Spaltenname aus variable generieren
Ganz abgesehen von Deinem ursprünglichen Anliegen würde ich Dein Datenbankdesign mal gründlich überdenken.

Normalisierung [http://de.wikipedia.org/wiki/Normalisierung_%28Datenbank%29]


hansa - Fr 16.12.05 20:02
Titel: Re: [SQL] Spaltenname aus variable generieren
user profile iconRobert.Wachtel hat folgendes geschrieben:
Ganz abgesehen von Deinem ursprünglichen Anliegen würde ich Dein Datenbankdesign mal gründlich überdenken.


Dem kann man nur zustimmen. 8)

user profile iconDer Jan hat folgendes geschrieben:
Es geht darum das ich in einer Tabelle eine Menge Spalten anlegen muß, die alle ähnlich heißen, also möchte ich das ganze in eine Procedure packen:


Geht es etwa nur um das Anlegen der Spalten ? :shock: Wenn dies per Programm gehen soll, dann sind definitiv zu viele Spalten da und die DB ist völlig falsch angelegt. Was soll denn da noch alles kommen, wenn tatsächlich Daten gespeichert werden ? :shock:


alzaimar - Fr 16.12.05 20:07

So wie ich das verstanden habe, muss er eine Pivot-Tabelle bzw. Crosstable erstellen, aber das kann "Der Jan" selber am Besten erklären. Dessenungeachtet wäre mit der Erstellung der ca. 80 Spalten jetzt schon läääängst fertig (das konnte ich mir nicht verkneifen).


hansa - Fr 16.12.05 20:20

user profile iconalzaimar hat folgendes geschrieben:
Dessenungeachtet wäre mit der Erstellung der ca. 80 Spalten jetzt schon läääängst fertig (das konnte ich mir nicht verkneifen).


So siehts aus, aber es geht so wohl nicht :

user profile iconDer Jan hat folgendes geschrieben:
Es müssen paar hundert spalten angelegt werden und ich bin zu faul, das alles manuell zu machen.


Ich habe das dumpfe Gefühl, daß hier DB-Felder mit Datensätzen evenzuell verwechselt werden und ein Admin Tool ein Fremdwort darstellt. :lol:


Der Jan - Di 20.12.05 11:26

Hallo,

also erstmal danke für die Antworten.
"EXECUTE STATEMENT" ist in der Tat genau das, was ich gesucht habe.

Um auf die anderen Sachen einzugehen bzw. Spekulationen ein Ende zu setzen: :)


user profile iconhansa hat folgendes geschrieben:

Ich habe das dumpfe Gefühl, daß hier DB-Felder mit Datensätzen evenzuell verwechselt werden und ein Admin Tool ein Fremdwort darstellt. :lol:


Absolut nicht. Ich arbeite in der Regel mit IBExpert und weiß schon, was was ist :wink:

user profile iconRobert.Wachtel hat folgendes geschrieben:
Ganz abgesehen von Deinem ursprünglichen Anliegen würde ich Dein Datenbankdesign mal gründlich überdenken.

[url=http://de.wikipedia.org/wiki/Normalisierung_%28Datenbank%29]Normalisierung[/url]


Das dumme ist, das es nicht "mein" Datenbankdesign ist. Wir hatten hier eine DB mit Inventar. Darin sind natürlich auch Leasing-, Raten- und Mietverträge gespeichert. Mit den zu zahlenden Raten etc. Das Problem ist, das jetzt ein neues Inventarprogramm benutzt werden soll und die alte DB (deren Design zugegeben nicht sehr toll ist, aber auch nicht von mir :) ) irgendwie importiert werden muß. Die Möglichkeiten des Imports in das neue Programm sind auch nicht so arg komfortabel und so muß ich wohl oder übel eine Zwischenlösung stricken. Dazu gehört auch, das z.B. die einzelnen Raten so besch***** abgelegt werden, anders krieg ich das nicht importiert.