Das Problem kenne ich.
Man kann einen Parameter nicht auf diese Weise wiederverwenden.
Inzwischen verwende ich
SQL Variabeln um das zu Umgehen. Alternativ kannst du dafür sorgen, dass die Parameter nur jeweils einmal vorkommen (:ID1, :ID2, etc.). Dann musst du allerdings jedem Parameter den entsprechenden Wert zuweisen.
Die Lösung mit den Variabeln finde ich jedoch übersichtlicher und einfacher:
Code:
DECLARE @ID integer
DECLARE @Name varchar(20)
SET @ID = :ID
SET @Name = :Name
DECLARE @TRANSE CHAR(8) = 'Transe00';
BEGIN TRANSACTION @TRANSE;
IF NOT EXISTS(SELECT * FROM ST_VKL WHERE ID=@ID)
INSERT INTO ST_VKL (ID,NAME) VALUES(@ID,@Name)
ELSE
UPDATE ST_VKL SET NAME=@Name WHERE ID=@ID;
IF @@ERROR = 0
COMMIT TRANSACTION @TRANSE
ELSE
ROLLBACK TRANSACTION @TRANSE;
Für die Typen von ID und Name benutzt du natürlich das was du brauchst. Da du diese Information nicht geliefert hast, musste ich irgendwas erfinden...
Übrigens würde ich die Parameter nicht mit @ deklarieren. Das @ Symbol wird von
SQL für Variablen verwendet, wenn du das von Delphi aus machst genügt
:VariabelName.