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

MS SQL Server Discussion :

[procédure stockée] Erreur dans un while


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut [procédure stockée] Erreur dans un while
    Bonjour à tous,
    J'ai la pocédure stockée suivante qui me génère une erreur de syntaxe que je n'arrive pas à corriger.

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    IF EXISTS(SELECT name FROM sysobjects WHERE name='RA_deleteSignatory')
    DROP PROCEDURE RA_deleteSignatory
    GO
    CREATE PROCEDURE RA_deleteSignatory
    @id_signatory numeric(4),
    @id_service numeric(5),
    @id_slice_price numeric(1),
    @id_is_deleted binary(1) output,
    @message varchar(100) output
    AS
    
    DECLARE @weight numeric(5) --poids du signataire à supprimer
    DECLARE @weight_signatory_other numeric(5) -- poids des signataires à remplacer
    DECLARE @id_signatory_other numeric(4) -- id des autres signataires
    
    SELECT @weight=S.WEIGHTING_SIGNATORY
    FROM [N4939037].[N4939037]
    WHERE S.ID_SIGNATORY=@id_signatory
    
    BEGIN
    
    DELETE FROM [N4939037].[TO_COUNT]
    WHERE ID_SERVICE=@id_service 
    AND ID_SIGNATORY=@id_signatory
    
    DELETE FROM [N4939037].[TO_DETERMINE]
    WHERE ID_SLICEPRICE=@id_slice_price
    AND ID_SIGNATORY=@id_signatory
    
    DELETE FROM [N4939037].[SIGNATORY]
    WHERE ID_SIGNATORY = @id_signatory
    
    
    WHILE (
    	SELECT 
    	@weight_signatory_other = S.WEIGHTING_SIGNATORY, 
    	@id_signatory_other = S.ID_SIGNATORY
    	FROM [N4939037].[SIGNATORY] S
    	INNER JOIN [N4939037].[TO_COUNT] TC on S.ID_SIGNATORY=TC.ID_SIGNATORY
    	INNER JOIN [N4939037].[TO_DETERMINE] TD on S.ID_SIGNATORY=TD.ID_SIGNATORY
    	WHERE TC.ID_SERVICE=@id_service
    	AND TD.ID_SLICEPRICE = @id_slice_price
    	) > @weight 
    
    	BEGIN
    		UPDATE [N4939037].[SIGNATORY]
    		SET WEIGHTING_SIGNATORY = (@weight_signatory_other-1)
    		WHERE
    		ID_SIGNATORY=@id_signatory_other
    	END
    
    
    END
    L'erreur est la suivante:


    Error 170: Line 33 : Incorrect syntax near '='
    pouvez vous m'aider sur ce problème ?

    Merci pour votre aide !

  2. #2
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    Par défaut
    c'est laquelle la ligne 33 ??

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Je viens de la souligner en gras, juste après le while.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    ton while fait ref a 2 entités:

    while ( select valeur1, valeur2 from ... ) > valeur3 ...

    il compare valeur1 ou valeur2 a valeur3 a ton avis ?

    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
    WHILE exists(
    	SELECT 1
    	FROM [N4939037].[SIGNATORY] S
    	INNER JOIN [N4939037].[TO_COUNT] TC on S.ID_SIGNATORY=TC.ID_SIGNATORY
    	INNER JOIN [N4939037].[TO_DETERMINE] TD on S.ID_SIGNATORY=TD.ID_SIGNATORY
    	WHERE TC.ID_SERVICE=@id_service
    	AND TD.ID_SLICEPRICE = @id_slice_price
    	and S.WEIGHTING_SIGNATORY > @weight) 
     
    	BEGIN
     
    	SELECT TOP 1
    	@weight_signatory_other = S.WEIGHTING_SIGNATORY, 
    	@id_signatory_other = S.ID_SIGNATORY
    	FROM [N4939037].[SIGNATORY] S
    	INNER JOIN [N4939037].[TO_COUNT] TC on S.ID_SIGNATORY=TC.ID_SIGNATORY
    	INNER JOIN [N4939037].[TO_DETERMINE] TD on S.ID_SIGNATORY=TD.ID_SIGNATORY
    	WHERE TC.ID_SERVICE=@id_service
    	AND TD.ID_SLICEPRICE = @id_slice_price
    	and S.WEIGHTING_SIGNATORY > @weight
     
    		UPDATE [N4939037].[SIGNATORY]
    		SET WEIGHTING_SIGNATORY = (@weight_signatory_other-1)
    		WHERE
    		ID_SIGNATORY=@id_signatory_other
    	END

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Ah oui tu as raison, je suis idiot !!!

    je vais tester la requête que tu m'as écrite ...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    J'ai testé cette requête mais il y a un léger disfocntionnement.
    En fait, cette requête permet de décrémenter le poids de chaque signataire (@id_signataire_other) dont le poids est supérieur à un signataire donné (@id_signataire) (qui est un signataire que je supprime)

    J'ai par exemple:

    Id-Poids

    A-1
    B-2
    C-3
    D-4
    E-5

    Je supprime B
    Quand j'utilise la procédure donnée, j'obtiens:
    A-1
    C-2
    D-2
    E-2

    Alors que je voudrais obtenir:
    A-1
    C-2
    D-3
    E-4


    ?????

    De plus, que signifie le SELECT 1 et le SELECT TOP 1

    Désolé, je maitrise pas du tout le SQL

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    Select top 1 permet de récupérer la première ligne de réponse de ta requête.
    Si tu veux les 10 première, tu fais select top 10.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Mais moi, je veux toutes les sélectionnées ...
    J'ai peur de pas bien comprendre.
    Comment faire pour touts les sélectionnées ?

  9. #9
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    pourquoi tu fais pas directement

    1° sélection de l'id avec poids voulu
    2° décrément de tous ceux qui sont supérieurs a id

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    declare @id_poids int
    set @id_poids=2
     
    delete tatable where poids=@id_poids
     
    update tatable set poids=poids-1  where poids>@id_poids

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    J'aimerais faire ça mais j'arrive pas à avoir une syntaxe correcte avec mes inner join ...

    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
     
     
    DECLARE @S varchar(50)
    DECLARE @TC varchar(50)
    DECLARE @TD varchar(50)
     
    SET @S='[N4939037].[SIGNATORY]'
    SET @TC='[N4939037].[TO_COUNT]'
    SET @TD='[N4939037].[TO_DETERMINE]'
    UPDATE S
     
    INNER JOIN TC ON S.ID_SIGNATORY=TC.ID_SIGNATORY
    INNER JOIN TD ON S.ID_SIGNATORY=TD.ID_SIGNATORY
     
    SET S.WEIGHTING_SIGNATORY=S.WEIGHTING_SIGNATORY - 1
    	WHERE TC.ID_SERVICE=@id_service
    	AND TD.ID_SLICEPRICE = @id_sliceprice
                 AND S.WEIGHT_SIGNATORY > @weight

  11. #11
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    je pense que tu veux faire un truc dans ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    UPDATE [N4939037].[SIGNATORY]
    SET WEIGHTING_SIGNATORY=WEIGHTING_SIGNATORY - 1
    FROM [N4939037].[TO_COUNT] TC
    INNER JOIN [N4939037].[TO_DETERMINE] TD ON TD.ID_SIGNATORY=TC.ID_SIGNATORY
    WHERE TC.ID_SERVICE=@id_service
    AND [N4939037].[SIGNATORY].ID_SIGNATORY=TC.ID_SIGNATORY
    AND TD.ID_SLICEPRICE = @id_sliceprice
    AND [N4939037].[SIGNATORY].WEIGHT_SIGNATORY > @weight
    tu ne peux pas aliasser un update:
    UPDATE toto T set T.champ1=U.champ2 from tutu U
    where ...
    il faut mettre le nom de la table updatée en dur partout

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Super !!
    ça marche,

    Merci pour ton aide. Je croyais que j'avais fait ça mais visiblement non !!

    Merci encore , vraiment !

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/05/2007, 12h44
  2. [Procédure stockée]Concaténation dans un IN
    Par jouille dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/07/2006, 16h54
  3. [Procédure stockée] Erreur 1305
    Par SSJ17Vegeta dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 18/11/2005, 02h38
  4. Procédure stockée, concaténation dans requête
    Par sbeu dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/08/2005, 12h03
  5. procédure stockée Oracle dans delphi 6
    Par UPNE387 dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/05/2004, 09h47

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