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 :

Curseurs paramétrables


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Curseurs paramétrables
    Bonjour,

    Je recherche une façon de paramétrer les curseurs au sein d'une procédure stockée.

    Je souhaiterais créer des cursor dont l'instruction Select fait référence à
    une table passée en paramètre de ma procédute stockée du style :

    Create PROC MAPROC
    (
    @maTable as nvarchar(30)
    )
    as
    DECLARE MONCURSEUR CURSOR FOR
    SELECT CHAMP1, CHAMP2 FROM @maTable
    ...

    Comment faire ? Bien-entendu ce que j'ai écris ci dessus ne fonctionne pas
    et de surcroit l'utilisation de la commande Exec est à proscrire dans ce cas.

    Merci d'avance pour vos réponses.

  2. #2
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    je suis sûre de rien mais l'autre fois des collègues disaient que c'était pas possible de passer le nom d'une table en paramètre d'une procédure stockée

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    DECLARE @CURSEUR VARCHAR(8000)
    SET @CURSEUR = 'CURSOR FOR SELECT TABLE_NAME FROM INORMATION_SCHEMA.TABLES'

    OPEN @CURSEUR

    FETCH @CURSEUR INTO ...

    Bien enetendu la chaine de car. peut être construite dynamiquement.

    Tout cela est bien entendu contre performant :
    1) l'utilisation des curseurs est déconseillé si l'on peut s'en passer (et dans 95% des cas on peut s'en passer !) parce que contre performant
    2) l'utilisation du SQL dynamique est d&éconseillé parce que contreperformant

    Conclusion : l'utilisation d'un curseur construit avec du SQL dynamique est TRES contre performante...

    Mais la question est : quel est ton but derrière ta demande ?

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Votre solution n'a pas l'air de fonctionner, il refuse obstinément de m'enregistrer ma procédure stockée en me donnant la réponse suivante :
    La variable '@SQLSTATEMENT' n'est pas une variable curseur, mais elle se trouve à un endroit où un curseur est attendu. L'erreur se produit sur la commande OPEN.

    ou @SQLSTATEMENT correspond à votre variable @CURSEUR.

    Ci dessous votre exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE @CURSEUR VARCHAR(8000) 
    SET @CURSEUR = 'CURSOR FOR SELECT TABLE_NAME FROM INORMATION_SCHEMA.TABLES' 
     
    OPEN @CURSEUR 
     
    FETCH @CURSEUR INTO ...
    Ci dessous le mien :

    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
    ALTER  PROCEDURE REGROUP
    (
    @TABLE_NAME AS VARCHAR(30)
    )
    as
    DECLARE @MEMO_GSM AS NVARCHAR(15)
    DECLARE @GSM AS NVARCHAR(15)
    DECLARE @SQLSTATEMENT AS NVARCHAR(150)
    declare @SQL_DELETE AS NVARCHAR(150)
     
    SET @SQLSTATEMENT = 'CURSOR FOR SELECT GSM FROM ' + @TABLE_NAME + ' ORDER BY GSM, DATENAIS'
     
    -- DECLARE STCURSOR CURSOR
    -- FOR exec sp_executesql @SQLSTATEMENT
     
    OPEN @SQLSTATEMENT
     
    FETCH NEXT @SQLSTATEMENT
    INTO @GSM
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
    ....
    En ce qui concerne l'aspect performance, il est vrai que l'utilisation des curseurs n'est pas recommandée, c'est quelque chose dont je suis en parfaite connaissance.
    En revanche il n'y a pas lieu de s'inquiéter de la performance de ce traitement (je l'estime en tout cas) et je n'ai réellement (pour l'instant) pas trouver de solution de remplacement par l'utilisation de requêtes, il n'est pas impossible que je sois dans mon cas dans les 5% restants.

    Il est à savoir que ce traitement porte sur les enregistrements d'une seule table il n'y a aucune jointure dans mes requêtes et il s'agit dans mon traitement de conserver ma TABLE tout en y supprimant des enregistrements dont je n'ai pas besoin.

    En réalité j'importe un fichier texte dans une table du même nom (située dans une basee réservée à ce genre de traitement) et je dois traiter les données de ce fichier en vue de resortir une version plus condensée.
    Je réalisait le traitement jusqu'ici dans une base Access à partir de code Vb et je me suis dit qu'il serait plus sympa d'utiliser la puissance de SQL Server pour réaliser ce traitement et donc le confier à une procédure stockée plutôt que de le laisser dans le code ou on multiplie les accès à la base pour rien.

    Merci déjà de votre réponse même si elle n'a pas encore apporté ses fruits.

    Cordialement,

    Alexandre[/b]

  5. #5
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    A essayer (mais je ne suis plus sur que le sql dynamique ne soit pas géré dans une sous-session)

    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
    ALTER  PROCEDURE REGROUP
    (
    @TABLE_NAME AS VARCHAR(30)
    )
    as
    DECLARE @MEMO_GSM AS NVARCHAR(15)
    DECLARE @GSM AS NVARCHAR(15)
    DECLARE @SQLSTATEMENT AS NVARCHAR(150)
    declare @SQL_DELETE AS NVARCHAR(150)
     
    SET @SQLSTATEMENT = 'DECLARE CURSOR MONCUR FOR SELECT GSM FROM ' + @TABLE_NAME + ' ORDER BY GSM, DATENAIS'
     
    exec sp_executesql @SQLSTATEMENT
     
    OPEN MONCUR
     
    FETCH NEXT MONCUR INTO @GSM
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
    ....
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  6. #6
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut C'est OK
    Bravo fadace

    Ta solution fonctionne et répond donc à mon problème.

    Je t'en remercie.

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

Discussions similaires

  1. Variable d'un curseur paramétré
    Par f-demu01 dans le forum PL/SQL
    Réponses: 2
    Dernier message: 06/02/2009, 14h40
  2. SQLDynamique vs Curseur paramétré
    Par jlinho2 dans le forum SQL
    Réponses: 16
    Dernier message: 03/04/2008, 14h53
  3. Boucle d'un curseur paramétré
    Par mike devimo dans le forum SQL
    Réponses: 2
    Dernier message: 12/11/2007, 15h52
  4. Curseurs paramétrés en T-SQL ??
    Par evans dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/04/2006, 15h35
  5. déclaration de curseur paramétré
    Par new_wave dans le forum Oracle
    Réponses: 3
    Dernier message: 21/11/2005, 14h53

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