Instructions SQL multiples exécutées via un object de command ADO.NET

J'ai besoin de mettre à jour un logging dans une table mais il est possible que l'logging n'existe pas, donc je devrais insert l'logging.

Voici une instruction SQL qui a atteint mon but en essayant de mettre à jour l'logging en premier et s'il n'existe pas, il effectue une insertion. Ce que je me request s'il peut être exécuté directement via l'object de command ADO.NET ou doit-il aller dans une procédure stockée.

UPDATE MyTable SET ReservationDate = @ReservationDate WHERE CustomerNumber = XXXX; IF @@ROWCOUNT=0 INSERT INTO MyTable (CustomerNumber , ReservationDate) VALUES (@CustomerNumber , @ReservationDate) 

Si je pouvais l'exécuter via l'object de command sans procédure stockée, cela signifierait une dépendance moindre pour le time de deployment (c'est-à-dire le deployment de la procédure stockée).

La command MERGE dans T-SQL fonctionne uniquement pour ce scénario

 ssortingng cmdText = @"MERGE MyTable T USING (SELECT @CustomerNumber As CustomerNumber) as S ON T.CustomerNumber = S.CustomerNumber WHEN MATCHED UPDATE SET ReservationDate = @ReservationDate WHEN NOT MATCHED INSERT INTO (CustomerNumber , ReservationDate) VALUES (@CustomerNumber , @ReservationDate)"; 

C'est juste une string de text enveloppée pour la lisibilité dans plus de lignes grâce au caractère verbatim @

Avec MERGE vous commencez à définir votre table TARGET (T), puis vous construisez un pseudotable appelé SOURCE (S) avec le paramètre qui contient la valeur du champ key primaire dans TARGET. Maintenant, les deux tables sont JOINED ON le champ CustomerNumber . Le produit de cette jointure peut être MATCHED ou NOT MATCHED fonction de la présence antérieure de l'logging dans la table TARGET . Le rest de la requête est probablement explicite, notez simplement que dans les deux actions (UPDATE et INSERT) il n'est pas nécessaire de répéter le nom MyTable (c'est le TARGET)

En passant, oui, vous pouvez passer plusieurs commands à la SqlCommand séparées par un point-virgule