Ich versuche, einen NULL-Wert an einen TSQLDataset-Parameter übergeben. Die Abfrage hat das folgende Format:Übergabe von NULL-Wert in parametrisierten Delphi-SQL-Server-Abfrage
Query_text:='MERGE INTO [Table]
USING (VALUES (:A,:B)) AS Source (Source_A, Source_B)
....
WHEN MATCHED THEN
UPDATE SET A = :A
WHEN NOT MATCHED THEN
INSERT(A, B) VALUES (:A,:B);
SQL_dataset.CommandType:=ctQuery;
SQL_dataset.CommandText:=Query_text;
SQL_dataset.ParamByName('A').AsString:='A';
SQL_dataset.ParamByName('B').AsString:={ COULD BE NULL, OR A STRING };
SQL_dataset.ExecSQL;
Parameter B ist nullfähig, ist aber auch ein Fremdschlüssel. Wenn der Benutzer etwas in dieses Feld eingibt, muss B mit Werten in einer anderen Tabelle verglichen werden. Wenn es leer ist, möchte ich, dass es ignoriert wird. Ich bin reingegangen, aber das erzeugt offensichtlich einen FK-Verletzungsfehler.
Ich habe versucht:
SQL_dataset.ParamByName('B').Value:=Null;
..aber dann bekomme ich eine Fehlermeldung „dbexpress Treiber den tdbxtypes.unknown Datentyp nicht unterstützt“.
ich auch versucht:
SQL_dataset.ParamByName('B').DataType:=ftVariant;
SQL_dataset.ParamByName('B').Value:=Null;
..aber dann bekam "dbexpress Treiber unterstützt nicht die tdbxtypes.variant Datentyp" Fehler.
Nicht sicher, was ich falsch mache, würde jede Hilfe geschätzt werden. Ich erstelle derzeit eine Parameterliste, basierend darauf, ob die Zeichenfolge ausgefüllt ist oder nicht, und das funktioniert gut; es ist nur ein bisschen klobig (in meiner eigentlichen Abfrage), da es einige Parameter zu validieren gibt.
Ich verwende Delphi XE4 und SQL Server 2012.
Update:
Vielen Dank für all die Hilfe, Anregungen entlang Recht vor, alle waren, war es etwas anderes, das das 'dbexpress Fahrer produziert Error. Ich war eine ‚flexible‘ Parameterliste in dem Bemühen, zu schaffen um mein Problem zu bekommen, und dies die Ausnahme verursacht:
Parameter_string:='';
If B<>'' then Parameter_string:='B = :B,'
Query_text:='MERGE ...'
'...'
'UPDATE SET A = :A, '+Parameter_string+' C = :C' ....
... die Idee ist, dass wenn B leer ist, dann wird der Parameter nicht " in der Abfrage aufgelistet.
Das funktioniert nicht, oder meine Implementierung funktioniert nicht (nicht sicher warum, ich vermisse offensichtlich einen Schritt irgendwo).
Wie dem auch sei, die Arbeitscode:
Query_text:='MERGE ...'
'...'
'UPDATE SET A = :A, B = :B, C = :C' ....
SQL_dataset.CommandType:=ctQuery;
SQL_dataset.CommandText:=Query_text;
If B<>'' then
begin
SQL_dataset.ParamByName('B').AsString:='B';
end
else
begin
SQL_dataset.ParamByName('B').DataType:=ftString;
SQL_dataset.ParamByName('B').Value:=Null;
end;
Danke, ich dies versuchte, gleiche Fehler wie oben in Kommentar zu @ pf1957 zur Kenntnis genommen. Mayve Ich habe etwas anderes, das diesen Fehler einschließt? – Alex
Danke für die Hilfe, siehe Update. – Alex