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
la source
MERGE
est simple, flexible et fait également partie de SQL Standard. Le vrai problème avec lesMERGE
autresUPSERT
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.Réponses:
Je pense que la réponse simple à cette question est non.
MERGE
était la réponse de Microsoft à laUPSERT
logique la plus compliquée . Et vous n'avez même pas énuméré la pire approche:Je viens de vomir dans ma bouche un peu en tapant ça, mais c'est en fait celui que je vois le plus souvent.
Dans tous les cas, s'il
MERGE
n'est pas flexible ou suffisamment puissant pour vous, je vous suggère de soumettre une demande de fonctionnalité à Microsoft à l' adresse http://connect.microsoft.com/sql/ et d'expliquer de manière approfondie votre analyse de rentabilisation. Tant que vous vous en tenez aux avantages réels de votre syntaxe proposéeMERGE
, vous avez mon vote. Si vous vous accrochez trop à la partie "sujette aux erreurs", je ne suis pas aussi susceptible d'accepter. Pourquoi? Parce que vous pouvez toucher n'importe quelle déclaration.Cela dit, je ne pense pas que quiconque ici puisse faire spécifiquement pour vous. Vous devez étudier les problèmes potentiels avec
MERGE
:http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/
la source