Requête INSERT OR UPDATE sous SQL SERVER





11-15-2012, 12:18 PM
Message : #1

Chat_128x128 Requête INSERT OR UPDATE sous 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 en SQL



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
Trouver tous les messages de cet utilisateur
Citer ce message dans une réponse


Articles ou discussions similaires
Exécuter une requête SQL SELECT plusieurs fois sur le même CTE
Pivoter des lignes en colonnes avec la requête PIVOT sous SQL Server
Différence de date en heures minutes et secondes sous SQL Server
Requête obtenir le numéro de version SQL Server exact
Requête SELECT simple sous SQL Server
Comment créer une procédure stockée simple sous SQL Server
Requête pour lister tous les index d’une base SQL Server