Sql server - une proc stock faisant soit un update soit un insert

3/5 (6 avis)

Snippet vu 16 477 fois - Téléchargée 35 fois

Contenu du snippet

Il est souvent très pratique de n'avoir qu'une seule procédure qui gère soit l'update des informations si elle existe déja, soit l'Insert des informations.
C'est donc une évolution de la Procédure stockée montrée ici :
- http://www.sqlfr.com/code.aspx?ID=26572

Source / Exemple :


CREATE   PROCEDURE dbo.AddOrUpdateUser
(
	@Login as nvarchar(15),
	@Nom as nvarchar(25),
	@Prenom as nvarchar(25),
	@Email as nvarchar(50),
	@Telephone as nvarchar(10)
)
AS

IF exists(SELECT USER_ID FROM dbo.TABLE_USERS WHERE (dbo.TABLE_USERS.USER_LOGIN = @Login))
-- Dans cette partie, le Compte existe déja, on a donc juste besoin de rafraichir les Informations
	BEGIN
		UPDATE 
			dbo.TABLE_USERS
		SET 	
			dbo.TABLE_USERS.USER_NOM = @Nom,
			dbo.TABLE_USERS.USER_PRENOM = @Prenom,
			dbo.TABLE_USERS.USER_EMAIL = @Email,
			dbo.TABLE_USERS.USER_TEL = @Telephone
		WHERE 
			dbo.TABLE_USERS.USER_LOGIN = @Login
	END
ELSE
-- Dans cette partie, le compte n'existe pas, on va donc le créer
	BEGIN
		INSERT INTO dbo.TABLE_USERS
			(USER_LOGIN, 
			USER_NOM, 
			USER_PRENOM, 
			USER_EMAIL, 
			USER_TEL)
		VALUES 
			(@Login, 
			@Nom, 
			@Prenom, 
			@Email, 
			@Telephone)
	END

Conclusion :


Bon Coding

Romelard Fabrice (Alias F___)

A voir également

Ajouter un commentaire Commentaires
crn_c21 Messages postés 302 Date d'inscription samedi 24 janvier 2004 Statut Membre Dernière intervention 4 février 2011
13 nov. 2009 à 18:07
Pour une exécution plus rapide remplacer :

IF exists(SELECT USER_ID FROM dbo.TABLE_USERS WHERE (dbo.TABLE_USERS.USER_LOGIN = @Login))

Par

IF exists(SELECT TOP 1 1 FROM dbo.TABLE_USERS WHERE (dbo.TABLE_USERS.USER_LOGIN = @Login))

c'est un détail, je le concède!
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
21 oct. 2005 à 15:52
Merci :)
cs_marcA Messages postés 12 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 3 août 2010
29 juin 2005 à 15:41
Bonjour,

Personnellement, j'utilise ceci :

Je ne sais pas si c'est moins bon ou pas.

Le Set NOCOUNT ON permet de recevoir les messages d'erreurs faits dans l'insert s'il y en a (dans des cas de contraintes pas exemple)

CREATE PROCEDURE dbo.AddOrUpdateUser
(
@Login as nvarchar(15),
@Nom as nvarchar(25),
@Prenom as nvarchar(25),
@Email as nvarchar(50),
@Telephone as nvarchar(10)
)
as
SET NOCOUNT ON
UPDATE
dbo.TABLE_USERS
SET
dbo.TABLE_USERS.USER_NOM = @Nom,
dbo.TABLE_USERS.USER_PRENOM = @Prenom,
dbo.TABLE_USERS.USER_EMAIL = @Email,
dbo.TABLE_USERS.USER_TEL = @Telephone
WHERE
dbo.TABLE_USERS.USER_LOGIN = @Login

If @@Rowcount = 0
INSERT INTO dbo.TABLE_USERS
(USER_LOGIN,
USER_NOM,
USER_PRENOM,
USER_EMAIL,
USER_TEL)
VALUES
(@Login,
@Nom,
@Prenom,
@Email,
@Telephone)


Marc
lord mathius Messages postés 24 Date d'inscription lundi 15 décembre 2003 Statut Membre Dernière intervention 24 novembre 2005
14 avril 2005 à 02:46
oui moi aussi je te remercie pour ce code car il repond exactement a ce que je chercher sans arriver a l'exprimé.

voila tu vient de m'eviter 1 tube d'aspirine et ca marche en prime.

bravo
cs_jimmy69 Messages postés 778 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 27 novembre 2008 1
22 déc. 2004 à 18:09
salut salut fabrice69,

Super ton code ....a chaque fois que je lis un de tes codes ....j'en apprends beaucoup crois moi !

Encore encore ....on veut plus de codes de ta part ;-) !
Tu n'as pas des exemple simples sur les droits et les jobs sous sql serveur a poster?

Merci pour tout....

A bientot

Ciao
Christophe
un bouillonnais
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.