SQL Server Upsert

SQL Server Upsert

Dans SQL Server, une opération «Upsert» combine les actions d'un insert et d'une instruction de mise à jour dans une seule instruction. Cette opération insère une nouvelle ligne dans une table si cette ligne n'est pas présente. Sinon, il met à jour une ligne déjà présente. L'avantage d'effectuer une opération UPSERT est qu'il élimine le besoin d'inserts et de mise à jour séparés, simplifiant votre code SQL et réduisant la probabilité d'erreurs.

Créer une table

Créons une table dans le serveur SQL que nous pouvons utiliser pour effectuer les opérations upsert sur.

Créer une table [dbo].[Employé](
[Empid] [smallInt] pas null,
[Nom] [nvarchar] (50) pas null,
[Depide] [smallInt] null,
[Sal] [int] null
)
Insérer dans [dbo].[Employé] ([Empid], [Nom], [Depide], [SAL])
VALEURS
(1, «Moumita», 5, 50000),
(2, «Orijit», 2, 30000),
(3, «Somdeb», 5, 60000),
(4, «Rocky», 2, 50000),
SELECT * FROM [DBO].[Employé];

Sortir:

Nom empid Depide Sal
1 Moumita 5 50000
2 Orijit 2 30000
3 Somdeb 5 60000
4 Rocky 2 50000

Façons d'effectuer l'opération Upsert

Il existe plusieurs façons d'effectuer une opération UPSERT dans le serveur SQL. Dans cet article, nous discuterons des trois méthodes courantes pour effectuer une opération UPSERT: Utilisation de la clause existant, de la fonction RowCount et de l'instruction Merge.

1. Utilisation de la clause

Cette méthode consiste à utiliser une sous-requête pour vérifier si la ligne existe déjà dans le tableau avant d'effectuer une instruction insert ou mise à jour. La clause existant renvoie vrai si la sous-requête renvoie des lignes.

Commencer la transaction
Declare @EmployeeId int = 17;
Declare @name varchar (max) = 'bidisha';
Si existe (sélectionnez * dans DBO.Employé avec (Updlock, sérialisable)
où Empid = @Employeeid)
Mettre à jour DBO.Employé
Set name = @name
Où empid = @Employeeid
AUTRE
Insérer dans dbo.Employé (empid, nom)
VALEURS
(@Employeeid, @name)
Commettre une transaction;

Sortir:

Nom empid Depide Sal
17 bidisha null nul

Ici, le code SQL utilise la méthode ESTISS pour effectuer une opération UPSERT dans le serveur SQL. Il initie une transaction et déclare les variables pour maintenir l'ID de l'employé et les valeurs de noms. Le code vérifie si un enregistrement avec l'ID d'employé donné existe dans le tableau à l'aide de la clause. S'il existe, il met à jour le nom de l'employé à une nouvelle valeur. Sinon, il insère une nouvelle ligne avec l'ID et le nom d'employé donné.

2. Utilisation de la fonction RowCount

Cette méthode implique d'abord l'exécution d'une instruction de mise à jour, suivie d'une instruction INSERT si l'instruction de mise à jour n'a pas mis à jour les lignes.

Commencer la transaction
Declare @EmployeeId int = 18;
Declare @name varchar (max) = 'Sonalika';
Mettre à jour DBO.Employé avec (Updlock, sérialisable)
Set name = @name
Où empid = @Employeeid
Si @@ rowcount = 0
Insérer dans dbo.Employé (empid, nom)
VALEURS
(@Employeeid, @name)
Commettre une transaction;

Sortir:

Nom empid Depide Sal
18 sonalika null nul

Ici, le code SQL tente de mettre à jour le nom de l'employé avec l'ID donné dans le tableau à l'aide de la mise à jour et des conseils sérialisables qui acquièrent un verrou exclusif sur la ligne sélectionnée. Si la mise à jour n'affecte aucune ligne, le code effectue une instruction INSERT pour insérer une nouvelle ligne avec l'ID de l'employé et les valeurs de nom d'employé donné.

3. En utilisant l'instruction Merge

Une troisième façon d'effectuer une opération UPSERT dans le serveur SQL est d'appliquer l'instruction Merge. Cette méthode combine les actions des instructions d'insertion et de mise à jour dans une seule déclaration, similaire à la clause existant mais avec des fonctionnalités plus avancées.

Declare @EmployeeId int = 18;
Declare @name varchar (max) = 'arnab';
Fusionner dbo.Employé avec (Holdlock) comme cible
Utilisation (valeurs (@employeeid, @name)) en tant que source (employeeId, nom)
Sur la cible.Empid = source.Employé
Lorsqu'il correspond à la mise à jour de la cible définir la cible.Name = source.Nom
Lorsqu'il n'est pas assorti, insérez (Empid, Name) des valeurs (source.Employeeid, source.Nom);

Sortir:

Nom empid Depide Sal
18 arnab null nul

Cette requête SQL utilise l'instruction Merge pour fusionner les données d'un tableau source dans une table cible. Il correspond aux lignes entre les deux tables à l'aide de la «colonne Empid», et met à jour la «colonne de nom» dans la table cible si une correspondance est trouvée. S'il n'y a pas de correspondance, il insère une nouvelle ligne.

Conclusion

Les opérations upsert sont une exigence commune dans le serveur SQL. Il existe plusieurs façons de les réaliser, notamment en utilisant la méthode EXIST, la fonction RowCount et l'instruction Merge. Nous pouvons choisir la meilleure approche en fonction de notre exigence.