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 :

Problème curseur + procédure


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
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Par défaut Problème curseur + procédure
    Bonjour,



    ça fait vraiment un bail que je n'ai pas fait du transact sql, j'essaie de faire une procédure contenant un curseur, cette procédure doit afficher la première ligne de résultats avec une accolade au début de la ligne et la dernière ligne avec une accolade de fermeture , sachant qu'il y aura des virgule entre les lignes au milieu.

    je bloque sur cette procédure depuis pas mal de temps le sql server m'affiche plein d'erreurs comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Msg 102, Niveau 15, État 1, Procédure affichage_pingFlow, Ligne 24
    Incorrect syntax near '='.
    Msg 102, Niveau 15, État 1, Procédure affichage_pingFlow, Ligne 25
    Incorrect syntax near ')'.

    voici mon code :
    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
     
    create procedure affichage_ping (@author_id id) as
     
    DECLARE @pkt_ctrl_nbr int
    DECLARE @date_creat varchar(10) 
    DECLARE @CurrentRow int
    DECLARE @ProcessRow int
    DECLARE @ActualRow int
    DECLARE @msg varchar(120)
     
    set @ActualRow=0;
     
    --decalartion du curseur de l'extraction
    DECLARE ping_Cursor CURSOR FOR
    	select pkt_ctrl_nbr,CONVERT(VARCHAR(10), create_date_time, 120)
    	from inpt_pkt_hdr
    where proc_stat_code = 10;
     
    OPEN ping_Cursor
    set @ProcessRow=@@rowcount;
    FETCH ping_Cursor INTO @pkt_ctrl_nbr, @date_creat
    WHILE @@FETCH_STATUS = 0
    begin
    	while(@ActualRow<@ProcessRow)
    	if( @ProcessRow = 0)
    		select @msg= '['+@pkt_ctrl_nbr+'", "CREATION":"'+ @pkt_ctrl_nbr)+'"},'
    		print @msg;
    		@ProcessRow++
     
    	else if (@ProcessRow==@@rowcount)
    		select @msg= @pkt_ctrl_nbr+'", "CREATION":"'+ @pkt_ctrl_nbr)+'"}]'
    		@ProcessRow++;
    		print @msg;
    		@ProcessRow++
     
    	else
    		select @msg= @pkt_ctrl_nbr+'", "CREATION":"'+ @pkt_ctrl_nbr)+'"}'
    		print @msg;
    		@ProcessRow++
     
     
    end
     
     
     
     
    --SET NOCOUNT ON;
     
    close ping_Cursor
    DEALLOCATE ping_Cursor


    je cherche à savoir comment corriger ces erreurs de syntaxe mais aussi à voir si mon algo est correcte merci

  2. #2
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Déjà au premier coup d'oeil :
    - il n'y a pas d'opérateur ++ en T-SQL : @ProcessRow += 1
    - il faut mettre tes instructions entre les IF dans un bloc BEGIN END

    Tu dois pouvoir écrire ta requête sans curseur, en concaténant le résultat en utilisant un XML PATH : http://blogs.msdn.com/b/lbanon/archi...e-requ-te.aspx

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Par défaut
    Merci pour ta réponse,
    j'ai bien vu le lien avec la concaténation des résultats sauf que je ne vois pas comment savoir si c'est la première ligne et la dernière de mon select ainsi je pourrai rajouter l'ouverture et la fermeture des crochets.
    concernant mon curseur je l'ai rectifié sauf que ça m'affiche encore des erreur quand je mets : @ActualRow +=1
    voici mon code:

    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
    create procedure affichage_pingFlow (@author_id id) as
     
    DECLARE @pkt_ctrl_nbr int
    DECLARE @date_creat varchar(10) 
    declare @CurrentRow int
    declare @ProcessRow int
    declare @ActualRow int
    declare @msg varchar(120)
     
    set @ActualRow=0
     
    --decalartion du curseur de l'extraction
    DECLARE pingFlow1_Cursor CURSOR FOR
    	select pkt_ctrl_nbr,CONVERT(VARCHAR(10), create_date_time, 120)
    	from inpt_pkt_hdr
    where proc_stat_code = 10;
     
    OPEN pingFlow1_Cursor
    set @ProcessRow=@@rowcount
    FETCH pingFlow1_Cursor INTO @pkt_ctrl_nbr, @date_creat
    WHILE @@FETCH_STATUS = 0
    begin
    	while(@ActualRow<@ProcessRow)
    	if( @ProcessRow =0)
    		BEGIN
    			set @msg= '['+@pkt_ctrl_nbr+'", "CREATION":"'+ @pkt_ctrl_nbr+'"},';
    			print @msg;
    			@ActualRow+= 1;
    		END
    	else if (@ActualRow==@ProcessRow) 
    		BEGIN
    			set @msg= @pkt_ctrl_nbr+'", "CREATION":"'+ @pkt_ctrl_nbr+'"}]';
    			@ActualRow += 1;
    		END
    	else
    		BEGIN
    			set @msg= @pkt_ctrl_nbr+'", "CREATION":"'+ @pkt_ctrl_nbr+'"}';
    			@ActualRow +=1 ;
    		END
     
    END
     
     
     
     
    --SET NOCOUNT ON;
     
    close pingFlow1_Cursor
    DEALLOCATE pingFlow1_Cursor
    merci pour ton aide

  4. #4
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Quelle version de SQL server ?
    Il n'y a pas d'opérateur == en T-SQL

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Par défaut
    c'est du sql server 2005

  6. #6
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    l'opérateur += n'est supporté qu'à partir de SQL Server 2008. Donc : @ProcessRow = @ProcessRow + 1

  7. #7
    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,

    Par ailleurs, une affectation doit débuter par un SET (ou éventuellement un SELECT)

    Vous pouvez essayer quelque chose comme ceci, à adapter sans doute (j'ai un peu extrapolé ce que vous semblez vouloir faire...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DECLARE @msg VARCHAR(MAX)
     
    SELECT @msg = 
    			COALESCE(@msg + ',', '[') 
    			+ '{"' + pkt_ctrl_nbr +'", "CREATION":"'+ CONVERT(VARCHAR(10), create_date_time, 120)+'"}'
    FROM	inpt_pkt_hdr
    WHERE	proc_stat_code = 10;
     
    SET @msg = @msg + ']'
     
    PRINT @msg

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Par défaut
    voila mon code final qui fonctionne sans erreurs: (reste à vérifier ce que ça donne)

    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
    create procedure affichage_pingFlow  as
     
    DECLARE @pkt_ctrl_nbr int
    DECLARE @date_creat varchar(10) 
    declare @CurrentRow int
    declare @ProcessRow int
    declare @ActualRow int
    declare @msg varchar(120)
     
    set @ActualRow=0
     
    --decalartion du curseur de l'extraction
    DECLARE pingFlow1_Cursor CURSOR FOR
    	select pkt_ctrl_nbr,CONVERT(VARCHAR(10), create_date_time, 120)
    	from inpt_pkt_hdr
    where proc_stat_code = 10;
     
    OPEN pingFlow1_Cursor
    set @ProcessRow=@@rowcount
    FETCH pingFlow1_Cursor INTO @pkt_ctrl_nbr, @date_creat
    WHILE @@FETCH_STATUS = 0
    begin
    	while(@ActualRow<@ProcessRow)
    begin
    	if( @ProcessRow = 0)
    		BEGIN
    			set @msg= '['+@pkt_ctrl_nbr+'", "CREATION":"'+ @pkt_ctrl_nbr+'"},';
    			print @msg;
    			set @ActualRow = @ActualRow+1;
    		END
    	else if (@ActualRow=@ProcessRow) 
    		BEGIN
    			set @msg= @pkt_ctrl_nbr+'", "CREATION":"'+ @pkt_ctrl_nbr+'"}]';
    			set @ActualRow = @ActualRow+1;
    		END
    	else
    		BEGIN
    			set @msg= @pkt_ctrl_nbr+'", "CREATION":"'+ @pkt_ctrl_nbr+'"}';
    			set @ActualRow = @ActualRow+1;
    		END
    end
     
    END
     
     
     
     
    --SET NOCOUNT ON;
     
    close pingFlow1_Cursor
    DEALLOCATE pingFlow1_Cursor

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

Discussions similaires

  1. Problèmes avec une procédure SQL server 2000
    Par verryvalentino dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/05/2012, 21h23
  2. Réponses: 3
    Dernier message: 06/09/2009, 18h22
  3. [VB.NET] Problème de connexion à SQL Server
    Par Nesmontou dans le forum ASP.NET
    Réponses: 8
    Dernier message: 29/07/2005, 10h12
  4. Problème Access to Sql Server
    Par vuldos dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/08/2004, 15h56
  5. Réponses: 3
    Dernier message: 18/11/2002, 16h36

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