Je me demandais si vous aviez rencontré une commande T-SQL similaire au concept d'UPSERT? L'exécution d'opérations INSERT | UPDATE à l'aide des options (1) ou (2) semble trop complexe et sujette aux erreurs.
OBJECTIF
Pour garantir que l'enregistrement souhaité (dans ce cas, employee_id 1) est à jour SANS avoir à écrire essentiellement la même requête deux fois.
LE CONTEXTE
- nom de la table: employé
- ID employé: possède une clé primaire et la propriété d'identité est définie sur true
OPTIONS
exécuter une mise à jour SQL ... vérifier @@ rowcount = 0 et @@ error = 0 ... exécuter SQL INSERT si nécessaire
- con: vous devez effectivement écrire deux fois la même requête, une fois en insert, une fois en mise à jour
- con: plus de code = plus de temps à taper
- con: plus de code = plus de place pour l'erreur
/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure "Mettre à jour en utilisant @@ rowcount"
- exécuter un SQL MERGE
- con: vous devez effectivement écrire deux fois la même requête, une fois en insert, une fois en mise à jour
- con: plus de code = plus de temps à taper
- con: plus de code = plus de place pour l'erreur
http://technet.microsoft.com/en-us/library/bb510625.aspx "Fusion T-SQL"
- exécuter un SQL UPSERT (la fonctionnalité n'existe pas)
- pro: vous définissez la relation données à table une fois (laissez SQL Server se soucier de savoir s'il s'agit d'un INSERT ou d'une UPDATE)
- pro: moins de code = mise en œuvre plus rapide
- pro: moins de code = plus faible probabilité
EXEMPLE UPSERT
UPSERT employeee (employee_id, employee_number, job_title, first_name, middle_name, Surname, modified_at) VALUES (1, '00 -124AB37 ',' Manager ',' John ',' T ',' Smith ', GetDate ());
- si employee_id 1 n'existe pas: MS SQL exécute une instruction INSERT
- si employee_id 1 existe: MS SQL s'exécute et l'instruction UPDATE
MERGE
est simple, flexible et fait également partie de SQL Standard. Le vrai problème avec les MERGE
autres UPSERT
implémentations est l'escalade potentielle des verrous ou même les blocages qui n'ont rien à voir avec la syntaxe.
MERGE
implémentation dans SQL Server.