Entwickler-Ecke

Datenbanken - SQL Abfrage


bockwurst - Mi 04.05.05 09:13
Titel: SQL Abfrage

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
      (* test *)
      AbfrageQuery.SQL.clear;
      s:='INSERT INTO "'+ZielPfad+'\KomBak" ';
      AbfrageQuery.SQL.Add(s);        //1.Zeile

      s:='("Kunden Nr") ';
      AbfrageQuery.SQL.Add(s);       //2.Zeile

      s:='Select A."Kunden Nr" ';
      AbfrageQuery.SQL.Add(s);       //3.Zeile

      S:='FROM KOMMISIO A ';
      AbfrageQuery.SQL.Add(s);       //4.Zeile

      s:='WHERE (A.Status= "nur erfaßt")';
      AbfrageQuery.SQL.Add(s);       //5.Zeile


Der folgende Code bringt den Fehler:
ungültiges Schlüsselwort SymbolString )
Zeilennummer 2

Dieser Fehler kommt immer dann wenn ich einen feldname mit einem Leerzeichen habe.

Was habe ich falsch gemacht


sunspeed - Mi 04.05.05 09:19

Lass dir das Statement insgesamt anzeigen (z.B. showmessage) und prüfe es wo der Fehler liegen könnte.
Scheint ein Fehler von SQL zu sein.

Du kannst normalerweise auch das SQL Statement direkt an Query.SQL.Text übergeben,
is vielleicht einfacher zu Analysieren.

Hoffe hab dir geholfen


Amiga-Fan - Mi 04.05.05 09:56

verstehe ich ehrlich gesagt nicht. Select und Insert gleichzeitig in der Query?


sunspeed - Mi 04.05.05 10:03

Wie soll dein Statement aussehen?
Wenn es zwei getrennte Statements sein sollen, schick sie seperat an

Delphi-Quelltext
1:
Query.SQL.Text                    


So machs ichs zumindest immer, dann tu ich mir leichter beim debuggen.


smiegel - Mi 04.05.05 10:32

Hallo,

was passiert, wenn Du den Feldnamen zwischen eckige Klammern setzt?

Delphi-Quelltext
1:
2:
3:
...
s:='([Kunden Nr]) '
...


bockwurst - Mi 04.05.05 11:18

@Smiegel: wenn ich den feldanamen in Eckige [] Klammern schreibe kommt eine neue Fehlermeldung: ungültige Schlüsselwort [Kunden

@Sunspeed: ich lasse es mir so anzeigen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
      try
        AbfrageQuery.ExecSQL;
        result:=true;
      except
        on E: Exception do
        begin
          MessageDlg(E.Message, mtError, [mbOk], 0);
          result:=false;
        end;
      end;


@Amiga-Fan: Ich vestehe auch so viel nicht, wenns aber klappt ist es OK
Wenn ich einen anderen Feldanme ohne Leerzeichen z.B. Nummer dan ist alles OK. Select und Insert Into gehen wohl sehr gut (muß sogar gehen) in einer Query.

@sunspeed: es macht wohl keinen Unterschied on ich Ouery.Text oder Ouery.SqL.Add daten einfüge. Allerdings gibt es Probleme mit Params. Die werden wohl nur "akiviert" mit SQL.Add


sunspeed - Mi 04.05.05 11:24

ich kann mir darunter nix mehr vorstellen :shock:
vielleicht is es ein simpler Fehler sprich, versuch statt den " mal ' vielleicht funzts dann.


bockwurst - Mi 04.05.05 11:32

@Sunspeed: Ich ahbe alles versucht " '''' ' '''' und nun auch [ aber leider geht es nicht.

normalerweise bräuchte ich das alles gar nicht weil ich nur Daten von einer Datenbank in eine andere kopieren/einfügen will. Die Datenbanken haben die gleiche Struktur/Feldnamen.

Das auch so:
INSERT ZIEL SELECT * QUELLE A
WHERE (A.Status='test')


wenn ich abernnoch abfragen zu einer zweiten Datenbank Abfragen mache, da geht es nicht mehr.

geht nicht mehr:
INSERT INTO ZIEL SELECT * QUELLE A, DetailQuelle B
WHERE (A.Status='test')
AND (A.Name=B.nummer)

dann muß ich hinter Ziel die Feldnamen angeben und den * auch ersetzen durch die Feldnamen


bockwurst - Mi 04.05.05 11:39

Das geht!:
INSERT INTO KomBak (nummer)
SELECT A.nummer
FROM Kommisio A


Das nicht:
INSERT INTO KomBak ("Kunden Nr")
SELECT A.("Kunden Nr")
FROM Kommisio A


sunspeed - Mi 04.05.05 11:41

Ich würd versuchen das ganze zu trennen. Mehr kann ich meinem geistigen Horizont momentan nicht entlocken. Sorry
Nimm zwei Querys für die eine DB und für die andere DB. (Wenn ich das Problem vorher richtig verstanden habe)
Mach ne Abfrage auf der einen DB, schieb die Daten in das Query von der zweiten DB und füg diese ein.

Viel Glück, wenn mir noch was einfällt, werde ich es posten.

:oops:


j-a-n@gmx.de - Mi 04.05.05 11:43

user profile iconbockwurst hat folgendes geschrieben:
@Sunspeed: Ich ahbe alles versucht " '''' ' '''' und nun auch [ aber leider geht es nicht.

normalerweise bräuchte ich das alles gar nicht weil ich nur Daten von einer Datenbank in eine andere kopieren/einfügen will. Die Datenbanken haben die gleiche Struktur/Feldnamen.

Das auch so:
INSERT ZIEL SELECT * QUELLE A
WHERE (A.Status='test')


wenn ich abernnoch abfragen zu einer zweiten Datenbank Abfragen mache, da geht es nicht mehr.

geht nicht mehr:
INSERT INTO ZIEL SELECT * QUELLE A, DetailQuelle B
WHERE (A.Status='test')
AND (A.Name=B.nummer)

dann muß ich hinter Ziel die Feldnamen angeben und den * auch ersetzen durch die Feldnamen


Das sollte trotzdem gehen.
Der Vollständigkeit (und Fehlerprüfung) halber würde ich das aber immer voll ausschreiben. also:

INSERT INTO ziel (status, nummer, name)
SELECT a.status, b.nummer, b.name
FROM quelle a, detailquelle b
WHERE a.Status='test'
AND a.Name=B.nummer


j-a-n@gmx.de - Mi 04.05.05 11:43

user profile iconbockwurst hat folgendes geschrieben:
@Sunspeed: Ich ahbe alles versucht " '''' ' '''' und nun auch [ aber leider geht es INSERT INTO ZIEL SELECT * QUELLE A, DetailQuelle B
WHERE (A.Status='test')
AND (A.Name=B.nummer)


Das sollte trotzdem gehen.
Der Vollständigkeit (und Fehlerprüfung) halber würde ich das aber immer voll ausschreiben. also:

INSERT INTO ziel (status, nummer, name)
SELECT a.status, b.nummer, b.name
FROM quelle a, detailquelle b
WHERE a.Status='test'
AND a.Name=B.nummer


hansa - Mi 04.05.05 11:56

Wenns auch weh tut, aber so viele Fehler auf einmal zu sehen, daß ist auch schmerzhaft. :mrgreen: Was treibst Du denn da überhaupt ? Du verwechselst Feldnamen mit deren Inhalt. Dann wird ein Insert gemacht ohne Values. Die Identifier müssen aus bestimmten Zeichen bestehen. Ein Leerzeichen darf da nicht rein. Mit den '"´` gibts sicherlich auch noch Ärger. usw. Try and error in Perfektion. 8) Man kann doch nicht nur so lange probieren, bis es geht und dann nicht mal wissen warum überhaupt. Lese das hier mal durch :

http://www.w3schools.com/sql/sql_insert.asp


bockwurst - Mi 04.05.05 11:58

@j-a-n@gmx.de: ja, voll ausschreiben, daß habe ich ja versucht. Aber da tritt das Problem mit den Feldnamen auf, die durhc ein Leerzeichen (Kunden Nr) getrennt sind. Wenn du mir sagen könntest, wie ich das lösen könnte.


jasocul - Mi 04.05.05 12:02

user profile iconhansa hat folgendes geschrieben:
Dann wird ein Insert gemacht ohne Values.

Hansa er macht ein insert mit einem Select. Da gibts kein "values".
Über Feldnamen mit Leerzeichen hab ich mich aber auch schon aufgeregt. Wer macht denn sowas.

@bockwurst:
Normalerweise steht aber in der Beschreibung zur Datenbank (ist die hier schon genannt worden?), wie man damit umgeht.


Amiga-Fan - Mi 04.05.05 12:04

Zitat:
Hansa er macht ein insert mit einem Select. Da gibts kein "values".


ah jetzt verstehe ich erst was er vorhat. Habe ich bis jetzt noch nie so gesehen...


bockwurst - Mi 04.05.05 12:11

@hansa: Bei INSERT INTO muß nicht unebdingt eine VALUES stehen

man kann zwar mit


Delphi-Quelltext
1:
2:
3:
SELECT INTO t_art
  (nummer, bezeichnung)
 VALUES(8, "Telefon bei Partner(in)")


eine Abfrage setzen

Doch mit einer Unterabfrage ist es auch getan

Die folgende Anweisung kopiert alle Kunden mit den Kundennummer größer 120 in die Tabelle alte_kunden.


Delphi-Quelltext
1:
2:
3:
4:
INSERT INTO alte_kunden (vorname, nachname)
SELECT vorname, nachmae
  FROM kunde
  WHERE nummer > 120


und das geht! aus ohne Values

aus dem Buch: delphi 5, nachschlagen und verstehen / michael Ebner)


hansa - Mi 04.05.05 12:38
Titel: Re: SQL Abfrage
Also gut, das mit den values ist dann geklärt. Aber was soll das hier :

user profile iconbockwurst hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
      s:='WHERE (A.Status= "nur erfaßt")';
      AbfrageQuery.SQL.Add(s);       //5.Zeile



Gleich 3 Fehler, die sich eventuell aber gegenseitig aufheben. 8) Wenn ich richtig rate, dann gibt es noch einen Wert, der "erfaßt" heißt. Insofern wäre es ein boolean und 0/1 als smallint oder char würde reichen. Das ß als deutsches Sonderzeichen könnte Ärger machen. Das ganze läßt sich schwieriger sortieren, als nötig. Wieso soll ich einen halben Satz aus der DB lesen wenn eine einzige Zahl ausreicht? Das bläht die DB unnötig auf. Groß/Kleinschreibung macht da keinen Sinn. Die Umwandlung kostet unnötige Zeit. Da "nur erfaßt" in Delphi wohl zum String wird, läßt sich nicht mal Case benutzen. Oder es wird sogar da erst in eine Zahl umgewandelt. :shock:


jasocul - Mi 04.05.05 12:49

@Hansa:
Ich glaube du fühlst dich angegriffen. Das wollte sicher keiner.
Deine Anregungen können richtig sein, müssen aber nicht.
Wie du selber schreibst, rätst du ja nur. Ob für Status zwei oder zwanzig Einstellungen möglich sind, wissen wir nicht (du also auch nicht). Und ob nach dem Feld sortiert wird ist auch nicht bekannt. Selbst wenn, ist das "ß" bei richtiger Spracheinstellung der DB auch kein Problem.

Wichtiger wäre zu wissen, welche DB bockwurst verwendet. Dann könnte man eventuell feststellen, wie dort mit Feldnamen, die Leerzeichen enthalten, umgegangen werden muss.


j-a-n@gmx.de - Mi 04.05.05 12:51

user profile iconbockwurst hat folgendes geschrieben:
@j-a-n@gmx.de: ja, voll ausschreiben, daß habe ich ja versucht. Aber da tritt das Problem mit den Feldnamen auf, die durhc ein Leerzeichen (Kunden Nr) getrennt sind. Wenn du mir sagen könntest, wie ich das lösen könnte.



ALTER TABLE quelle CHANGE `Kunden Nr` kundennr int(11);

:lol: :D :mrgreen: :les: :nut: :rofl:


bockwurst - Mi 04.05.05 13:23

@j-a-n@gmx.de: Mit der Hilfe habe ich eher gemeint, wie ich das mit den Leerzeich zwischen den Feldnamen systaxtisch richtig schrieben kann und nicht die ganze Tabelle ändern kann. Du hast aber recht, Leerzeichenn sind was sau dummes und sie sollen in Feldnamen alle sterben. Aber ich kann die datenbank nicht einfach so ändern:

@hansa: mit dem "nur erfaßt" ist wirklich vielleicht nicht so schau. Da 'ß' macht dabei allerdings keine Probleme. Das was mir wirklich "nur" probleme macht sind die Leerzeichen in den Feldnamen. Die Tabellenstruktur darf ich nicht ändern.


hansa - Mi 04.05.05 13:38

Ist das eine Vorgabe, es falsch zu machen ? Na ja, dann sage deinem Kollegen Bratwurst, der das da verbrochen hat, bei mir wäre er jetzt eine Currywurst. :mrgreen:


j-a-n@gmx.de - Mi 04.05.05 16:11

user profile iconbockwurst hat folgendes geschrieben:
@j-a-n@gmx.de: Mit der Hilfe habe ich eher gemeint, wie ich das mit den Leerzeich zwischen den Feldnamen systaxtisch richtig schrieben kann und nicht die ganze Tabelle ändern kann. Du hast aber recht, Leerzeichenn sind was sau dummes und sie sollen in Feldnamen alle sterben. Aber ich kann die datenbank nicht einfach so ändern:


Ja, meine antwort war auch nicht so richtig ernst gemeint.
Ich habe dafür auch keine Lösung. Ich bau mit D~ hautpsächlich Erweiterungen für ne WWS und erlebe auch immer wieder Dinge wo es mich schüttelt. Das beste was ich erlebt habe war ein feld names update !!!