![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: FireDAC XE7
Problem mit SQL und Parametern
Moin, ich beschäftige mich gerade mit Firebird und hänge an einem SQL Befehl und kommt nicht weiter. Laut Recherche im Web sollte das aber möglich sein.
Code:
Das setzen der Parameter mache ich wie folgt:
MERGE INTO Tabelle1 T1
USING (SELECT :MOD_FIRMA MOD_FIRMA, :MOD_NR MOD_NR from RDB$DATABASE) M1 ON M1.MOD_FIRMA = T1.MOD_FIRMA and M1.MOD_NR = T1.MOD_NR WHEN NOT MATCHED THEN INSERT (MOD_FIRMA, MOD_NR) values (M1.MOD_FIRMA, M1.MOD_NR)
Delphi-Quellcode:
Ich bekomme dann zur Laufzeit folgenden Fehler:
qry.ParamByName('MOD_FIRMA').AsString := 'Test';
qry.ParamByName('MOD_NR').AsString := 'Test'; qry.ExecSQL;
Code:
Ich habe auch schon probiert den Datentyp der Parameter zu setzten
[FireDAC][Phys][FB]Dynamic SQL Error SQL error code = -804 Data type unknown
Delphi-Quellcode:
es kommt aber immer noch der selbe Fehler.
qryImp.ParamByName('MOD_FIRMA').DataType := ftString;
qryImp.ParamByName('MOD_FIRMA').AsString := 'Test'; qryImp.ParamByName('MOD_NR').DataType := ftString; qryImp.ParamByName('MOD_NR').AsString := 'Test'; Hat jemand eine Idee an was es liegen könnte? |
AW: Problem mit SQL und Parametern
Du erzeugst ein viruelles Wertepaar über Deine Parameter. Die Parameter sind allerdings nicht typisiert, das könnte ein Teil des Problems sein.
Dann ist mir nicht wirklich klar, was Du mit dem gesamten Statement erreichen willst, insbesondere da die genutzte Datenquelle ein "Einzeiler" aus dem Client ist. Dieser Statementtyp ist m.E. sehr gut geeignet, um Tabellen innerhalb der DB massenhaft anzureichern / zu ändern, gespeisst aus anderen Tabellendaten. Die Parametrierung wird dabei dann nur als Einschränkung verwendet, nicht als Datenquelle. Würde hier nicht ein simples insert reichen? |
AW: Problem mit SQL und Parametern
Ich bekomme mehrere Textdateien als Stammdaten geliefert und muss diese in eine Tabelle einfügen. Es kann dabei sein, dass Datensätze in den Textdateien doppelt vorhanden sind. Diese sollen nicht doppelt in die Tabelle geschrieben werden. Bei meiner Suche nach einer Lösung bin ich auf das MERGE gestoßen und habe es als eine geeignete Methode gesehen mein Problem zu lösen, ohne dass ich beim Importieren vorher immer abfragen muss, ob ein Datensatz schon vorhanden ist. Ich habe mir im Web mehrere Infos angesehen, z.B.
![]() ![]() Ich habe es auch schon mit einem CAST probiert:
Code:
Da bekomme ich aber eine Fehler "Token unknown )" Das ")" ist das von "VARCHAR)".
USING (SELECT CAST(:MOD_FIRMA AS VARCHAR) AS MOD_FIRMA, CAST(:MOD_NR AS VARCHAR) AS MOD_NR FROM RDB$DATABASE) AS M1
Wenn ich die Werte fest in den SQL einbaue, dann funktioniert es. Eleganter hätte ich es gerne über die Parameter gemacht. |
AW: Problem mit SQL und Parametern
Funktioniert es denn mit
![]() |
AW: Problem mit SQL und Parametern
Versuch mal statt des Cast eine Funktion mit Textresult, also z.B. Trim oder so, die dem Inhalt nichts tut.
Wieso nicht mit Insert .. where not exists? oder where (zielval1, zielval2) not in (param1, param2) ? Ich weiß allerdings nicht, ob fb die 2. Notation kennt. |
AW: Problem mit SQL und Parametern
Guten Morgen,
mit "UPDATE OR INSERT" funktioniert es mit den Parametern. mit TRIM kommt der selbe Fehler. Ein "WHERE NOT EXISTS" scheint es bei Firebird mit "INSERT" nicht zu geben. Ich hab jedenfalls keine Infos dazu gefunden und alle Tests haben fehlgeschlagen. |
AW: Problem mit SQL und Parametern
Ja, beim
SQL-Code:
nicht, aber beim SELECT vom
INSERT INTO (...) VALUES (...)
SQL-Code:
geht ein WHERE. :angle2:
INSERT INTO (...) SELECT ...
SQL-Code:
INSERT (MOD_FIRMA, MOD_NR) SELECT CAST(:MOD_FIRMA AS VARCHAR), CAST(:MOD_NR AS INTEGER) -- eventuell auch ohne CAST
WHERE NOT EXISTS(SELECT true FROM Tabelle1 WHERE MOD_FIRMA = MOD_FIRMA AND MOD_NR = :MOD_NR) |
AW: Problem mit SQL und Parametern
Danke @himitsu,
mit kleinen Änderungen funktioniert es so:
SQL-Code:
INSERT INTO Tabelle1 (MOD_FIRMA, MOD_NR)
SELECT :MOD_FIRMA, :MOD_NR FROM RDB$DATABASE WHERE NOT EXISTS(SELECT ID FROM Tabelle1 WHERE MOD_FIRMA=:MOD_FIRMA AND MOD_NR=:MOD_NR) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz