Ecrire une requête INSERT OR UPDATE avec SQL Server




Comment faire un INSERT OR UPDATE sous SQL SERVER? Voici 2 solutions pour effectuer un UPDATE ou INSERT en évitant l’erreur SQL « Cannot insert duplicate key in object » car la ligne en question existe déjà dans la table cible.

Exemple de code de création de la table VENTES utilisée pour l’exemple INSERT or UPDATE.

-- Si la table existe déjà, alors on la supprime
IF exists (
  SELECT 1 FROM sys.objects
  WHERE  object_id = object_id(N'[dbo].[VENTES]') AND type in (N'U')
)
BEGIN  DROP TABLE [dbo].[VENTES]
END
GO

-- Creation de la table d'exemple avec la colonne MOIS déclarée comme UNIQUE
CREATE TABLE [dbo].[VENTES]
(
  [MOIS]		nvarchar(20) UNIQUE,
  [MONTANT]	numeric(5)
)
GO

-- Insertion des données pour l'exemple
INSERT INTO dbo.VENTES ( MOIS, MONTANT ) VALUES  ( N'Janvier', 1000);
INSERT INTO dbo.VENTES ( MOIS, MONTANT ) VALUES  ( N'Janvier', 2000);

 

Le message d’erreur qui s’affiche ressemble à cela :

(1 row(s) affected)
Msg 2627, Level 14, State 1, Line 3
Violation of UNIQUE KEY constraint ‘UQ__VENTES__*’. Cannot insert duplicate key in object ‘dbo.VENTES’. The duplicate key value is (Janvier).
The statement has been terminated.

 

Deux solutions pour faire un INSERT or UPDATE simplement avec SQL Server

 

La première solution pour lancer un INSERT OR UPDATE sous Micosoft SQL Server est la suivante, un test d’existence des données dans la table est utilisé avec la fonction EXISTS().

 

IF EXISTS(SELECT * FROM dbo.VENTES WHERE MOIS = 'Janvier')
BEGIN
  UPDATE 	dbo.VENTES
  SET 	MONTANT = 2000
  WHERE 	MOIS = 'Janvier'
END
ELSE
BEGIN
  INSERT INTO dbo.VENTES ( MOIS, MONTANT ) 
  VALUES  ( N'Janvier', 2000)
END

 

Voici la deuxième solution, un UPDATE est effectué, et seulement si le nombre de lignes mises à jour est égal à 0 alors on exécute l’instruction INSERT.

UPDATE 	dbo.VENTES
SET 	MONTANT = 2000
WHERE 	MOIS = 'Janvier'

IF @@ROWCOUNT = 0
BEGIN
  INSERT INTO dbo.VENTES ( MOIS, MONTANT ) 
  VALUES  ( N'Janvier', 2000)
END