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 :

[TSQL] Syntaxe Curseur


Sujet :

MS SQL Server

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 344
    Points : 3 860
    Points
    3 860
    Par défaut [TSQL] Syntaxe Curseur
    Bonjour à tous,

    Je rencontre un petit problème sur la déclaration d'un curseur dans une procédure stockée.
    Voici le code (allégé) de la procédure stockée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE PROCEDURE P0600 
    AS
    BEGIN
    DECLARE  @I1 VARCHAR(5000)
    DECLARE C1 CURSOR FOR @I1
    SET @I1 = 'SELECT * FROM F0600'
    OPEN C1
    FETCH NEXT FROM C1
    END
    J'ai une erreur de syntaxe sur le curseur, au niveau de @I1.

    Pour être plus clair, la requête du curseur sera créée dynamiquement selon les paramètres reçues par la procédure.

    Je suppose que l'erreur provient du fait que je déclaire le curseur sur une variable, mais je n'arrive pas à trouver la bonne syntaxe, ou méthode d'utilisation.

    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Voici une syntaxe plus correcte :

    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
    CREATE PROCEDURE P0600 
    AS
    BEGIN
     DECLARE C1 CURSOR FOR 
     SELECT <nomcolonne> FROM F0600
     
     OPEN C1
     FETCH NEXT FROM C1 INTO <unevariable>
     WHILE @@FETCH_STATUS = 0
     BEGIN
       ...
     
       FETCH NEXT FROM C1 INTO <unevariable>
     END
     CLOSE C1
     DEALLOCATE C1
    END
    Cependant dans la plupart des cas il est tout à fait possible de remplacer votre curseur par un code ensembliste. Avec un curseur les performances de votre procédure risquent de ne pas être au rendez-vous (Voir ce billet)

    ++

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 344
    Points : 3 860
    Points
    3 860
    Par défaut
    Bonjour et merci pour votre réponse rapide.

    J'avais lu cet article et un autre, concernant cette "mauvaise" habitude sur l'utilisation du curseur.

    Les procédures que je créée me permettent de construire dynamiquement une requête, le "SELECT * FROM F0600" étant la base de départ de la requête.
    Suivant les paramètres envoyés à la procédure, j'ajoute via des CASE... IF... des jointures, des restrictions.
    Finalement, je ne vois pas comment faire autrement qu'utiliser un curseur pour me retourner le résultat, je me trompe ?

    Pour information, l'utilisation des procédures stockées est une contrainte sur le développement en cours.

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    L'utilisation des procédures stockée est une bonne chose.

    Pour répondre à votre question concernant les curseurs, il faudrait avoir plus de précisions concernant votre problème. Que voulez vous faire exactement ?

    ++

  5. #5
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 344
    Points : 3 860
    Points
    3 860
    Par défaut
    Je vois que je ne suis pas assez claire :
    Voici une partie du code moins allégé de ma procédure :
    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
    CREATE PROCEDURE P0600 
    	@V0 SMALLINT
    	, @V1 CHAR(5)
    	, @V2 CHAR(5)
    	, @V3 CHAR(8)
    	, @V4 CHAR(8)
    	, @V5 INTEGER
    	, @V6 VARCHAR(30)
    	, @V7 CHAR(2)
    	, @V8 CHAR(2) 
    AS
    BEGIN
     DECLARE  @I1 VARCHAR(5000)
     DECLARE C1 CURSOR @I1
    SET @I1 = 'SELECT * FROM F0600'
    IF (@V0 = 1)
     BEGIN
     SET @I1 = @I1 + ' INNER JOIN <table> ON ... '
     END
    ELSE IF @V0 = 2
     BEGIN
     SET @I1 = @I1 + ' WHERE ...'
     IF @V2 <> '00000' 
      BEGIN
      SET @I1 = @I1 + ' ORDER BY...'
      END
     END
    OPEN C1
    FETCH NEXT FROM C1
    END
    Au final, je peux me retrouver avec l'exécution de "SELECT * FROM F0600" ou de "SELECT * FROM F0600 INNER JOIN <table> ON...".

    La requête à exécuter par le curseur peut être différente d'un paramètre à un autre, et donc voilà pourquoi je voudrais déclarer un curseur sur une variable de type chaine.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 862
    Points : 53 013
    Points
    53 013
    Billets dans le blog
    6
    Par défaut
    Dans ce cas vous devez créer un curseur dynamique. Jettez un coup d'oil à sp_describe_cursor

    A +

  7. #7
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 344
    Points : 3 860
    Points
    3 860
    Par défaut
    Merci, je vais y jeter un oeil.
    Autrement, j'ai trouvé cela :
    http://www.developpez.net/forums/d23...rsor-executer/

  8. #8
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 344
    Points : 3 860
    Points
    3 860
    Par défaut
    Voici une solution au problème pour ceux que ça intéresserait :
    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
    CREATE PROCEDURE P0600 
    	@V0 SMALLINT
    	, @V1 CHAR(5)
    	, @V2 CHAR(5)
    	, @V3 CHAR(8)
    	, @V4 CHAR(8)
    	, @V5 INTEGER
    	, @V6 VARCHAR(30)
    	, @V7 CHAR(2)
    	, @V8 CHAR(2) 
    AS
    BEGIN
     DECLARE  @I1 NVARCHAR(4000)
     DECLARE @cur_C1 CURSOR
    SET @I1 = N'SET @cur_C1 = CURSOR STATIC FOR 
    		SELECT * FROM F0600; 
    		OPEN @cur_C1';
    EXEC sp_executesql @I1
    	, N'@cur_C1 cursor OUTPUT', 
    	@cur_C1 OUTPUT
    FETCH NEXT FROM @cur_C1
    END
    Attention, il faut penser à déclarer la variable contenant la requête à exécuter en NVARCHAR.

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

Discussions similaires

  1. Syntaxe TSQL : concaténation
    Par santino1984 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 02/07/2008, 08h28
  2. [ASE]Syntaxe curseur sur procédure stockée
    Par tosprou dans le forum Adaptive Server Enterprise
    Réponses: 4
    Dernier message: 18/09/2007, 14h39
  3. [SQL2005][TSQL] Problème de curseur / Fonction ne "compile" pas
    Par Ivenoproblemwiththat dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/06/2007, 21h55
  4. [ASE12][TSQL]Curseur sous Sybase
    Par jeff37 dans le forum Sybase
    Réponses: 4
    Dernier message: 15/01/2007, 17h42
  5. [SQL2K][TSQL] Curseur : Requête select_statement dynamique
    Par Fred72250 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/09/2006, 22h31

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