IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Procédure stockée avec un IF/ELSE [2008]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Par défaut Procédure stockée avec un IF/ELSE
    Bonjour à toutes et à tous,

    J'ai une table contenant des ordinateurs ('computerName'), avec une liste de composants sous forme de chaine de caractères ('objectsList'), et le statut du poste sous la forme d'un caractère ('status').
    Je dois travailler avec l'existant, je ne peux pas modifier cette table, je sais ce n'est pas très "feng shui" comme structure de BDD.

    Pour remplir cette table j'utilise une procédure stockée et respectant quelques consignes:

    1. je ne dois avoir qu'une ligne par ordinateur, donc le 'computerName' doit être unique
    2. Si le 'computerName' existe déjà et que le 'status' est égale à 'A' alors je fais un update de la ligne
    3. Sinon le 'computerName' existe déjà mais que le 'status' n'est pas égal à 'A' alors je ne fais rien


    Voici la procédure que j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    ALTER PROCEDURE [dbo].[sp_INSERT_REQUEST] 
    	@computerName varchar(25),
    	@objectsList varchar(1024)
    AS
    BEGIN
    	IF NOT EXISTS (
    		SELECT computerName FROM dbo.matable
    		WHERE computerName = @computerName
    	)
    		BEGIN
    		INSERT INTO matable
    		(computerName,objectsList,status)
    		VALUES
    		(@computerName,@objectsList,'D')
    		END
    	ELSE
    		IF EXISTS (
    			SELECT computerName FROM dbo.matable
    			WHERE computerName = @computerName AND status = 'A'
    			)
    			BEGIN
    				EXEC dbo.sp_UPDATE_REQUEST lastRenevalTest = GETDATE(), objectsList = @objectsList, status = 'D';
    			END
    END
    J'obtiens une erreur SQL "Incorrect syntax near '='" mais je ne sais pas pour quelle ligne. La ligne indiquée par Ms-SQL contient cela : "(computerName,objectsList,status)".

    Est-ce que cette procédure vous parait correcte dans le raisonnement, et quelle est la petite coquille qui s'est glissée dedans et que je ne vois pas?

    Merci pour votre attention.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    A première vue, la logique est bonne.

    Votre erreur provient à mon avis de l'appel à la procédure stockée de mise à jour. Vous ne pouvez pas faire appel à une fonction dans l'appel à la procédure.

    Il faut donc stocker le GETDATE() dans une variable avant, et utiliser la variable lors de l'appel de la procédure.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Par défaut
    Merci aieeeuuuuu pour votre réponse.

    Après examen je viens de m'apercevoir que j'ai peut-être oublié certaines valeurs pour mon UPDATE. Alors pour ne pas être pollué par des fonctions j'ai modifié mon code comme ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    ALTER PROCEDURE [dbo].[sp_INSERT_REQUEST] 
    	@computerName varchar(25),
    	@objectsList varchar(1024)
    AS
    BEGIN
    	IF NOT EXISTS (
    		SELECT computerName FROM dbo.matable
    		WHERE computerName = @computerName
    	)
    		BEGIN
    		INSERT INTO matable
    		(computerName,objectsList,status)
    		VALUES
    		(@computerName,@objectsList,'D')
    		END
    	ELSE
    		IF EXISTS (
    			SELECT computerName FROM dbo.matable
    			WHERE computerName = @computerName AND status = 'A'
    			)
    			BEGIN
    				EXEC dbo.sp_UPDATE_REQUEST computerName = @computerName, lastRenevalTest='2018-05-30 10:10:10.101', objectsList = @objectsList, status = 'D', lastErrorMessage = 'COUCOU', nbAttemps = 0
    			END
    END
    J'obtiens toujours le même message : "Procedure sp_INSERT_REQUEST, Line 23 [Batch Start Line 7] Incorrect syntax near '='." qui m'indique le premier = concernant les paramètres de mon update. (je l'ai mis en rouge dans le code pour mieux le distinguer).

    Donc j'ai une erreur autre que le GETDATE(), mais je ne vois pas quoi.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    ha oui... il manque les @ devant les noms de paramétres de la procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXEC dbo.sp_UPDATE_REQUEST @computerName = @computerName, @lastRenevalTest='2018-05-30 10:10:10.101', @objectsList = @objectsList, status = 'D', @lastErrorMessage = 'COUCOU', @nbAttemps = 0

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Par défaut
    Après beaucoup de tâtonnements j'ai fini par réussir à faire ce que je voulais. Voici le code qui fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    ALTER PROCEDURE [dbo].[sp_INSERT_REQUEST] 
    	@computerName varchar(25),
    	@objectsList varchar(1024)
     
    AS
    BEGIN TRANSACTION
    	DECLARE @nbAttemps tinyint,
    			@status char(1),
    			@lastErrorMessage varchar(512),
    			@nbAttempts tinyint,
    			@lastRenevalTest datetime
    	SELECT @status = [status], @lastErrorMessage = [lastErrorMessage], @lastRenevalTest = [lastRenevalTest]
    		FROM [dbo].[matable] 
    		WHERE [computerName] = @computerName
    		BEGIN
    			IF (@status = 'A')
    				EXEC dbo.sp_UPDATE_REQUEST @computerName=@computerName, 
    					@lastRenevalTest=@lastRenevalTest,
    					@objectsList=@objectsList,
    					@status='D',
    					@lastErrorMessage=@lastErrorMessage,
    					@nbAttempts=0
    			ELSE IF (@status IS NULL)
    				INSERT INTO [dbo].[matable] ([computerName],[objectsList],[status])
    				VALUES (@computerName,@objectsList,'D')
     
    END
    COMMIT
    La logique n'était pas complètement bonne, et la syntaxe un peu bancale... mais à la fin c'est la victoire.

    Merci pour le coup de main!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/12/2017, 18h03
  2. Procédure stockée avec SELECT UNION
    Par maredami dans le forum Oracle
    Réponses: 4
    Dernier message: 07/11/2005, 11h05
  3. Procédure stockée avec serveur lié et paramètres
    Par AITOZ dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/10/2005, 17h51
  4. Procédure stockée avec param de sortie:marchepas av ADO
    Par Fabby69 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/10/2004, 12h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo