La seule solution complètement indépendante de la base de données, utilisant des bases de données un peu modernes, consiste à appeler la mise à jour puis l'insertion en deux opérations. Certaines bases de données n'autorisent pas l'envoi de plusieurs instructions en une seule opération et certaines bases de données peuvent ne pas renvoyer le nombre de lignes affectées par la mise à jour, je ne m'y fierais donc pas.
Update MyTable
Set Data = 'Data'
Where KeyCol = 'key';
(appel séparé)
Insert Into MyTable(KeyCol, Data)
Select 'key', 'Data'
From ( Select 1 As Value ) As Z
Where Not Exists (
Select 1
From MyTable As T1
Where T1.KeyCol = 'key'
);