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 :

T-SQL curseur avec parametre


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Par défaut T-SQL curseur avec parametre
    Bonjour,

    Je suis nouveau dans le développement T-SQL... et je me pose diverses questions. Je viens du Monde Oracle PL-SQL .

    Merci d'avance pour ceux qui essaieront de répondre à mes questions:
    - Aparemment, il n'est pas possible d'utiliser des variables avec un curseur?
    Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    declare cur1 cursor for
    select dept_id, dept_name
    from departments
    where location = @location
    Cela me parait vraiment bizarre?

    Mon objectif est de récupérer plusieurs lignes d'une table a l'aide d'une variable dynamique.
    Exemple:
    => Selection des parents
    Select * from parents.
    => Selection des enfants des parents
    Select * from enfants where parent = @resultat de la query précédente.
    => Pour chacun des enfants, je vais faire quelques opérations de calculs

    Bref, si vous pouviez m'aider à contourner cela,m'indiquer quelle est la logique de T-SQL, ca me permettrait fortement d'avancer.

    Je tiens à vous informer que j'ai pas mal cherché avant de poster...
    Merci d'avance
    Nicolas

    D'avance, je vous en remercie.

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    En principe ça marche aussi avec une variable.

    Qu'est-ce qui te fait dire que cela ne fonctionne pas ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Par défaut
    Tout d'abord, merci bien d'avoir répondu.

    En fait, j'ai l'impression qu'il bloque sur open cursor

    Je mets des log:
    - juste avant ouverture du curseur,
    - Juste après l'ouverture
    Il ne va pas plus loin que l'ouverture...et pourtant, il ne me met aucun message d'erreur pendant la compilation ou l'exécution...

    Merci encore.
    Nicolas

  4. #4
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Par défaut
    Vous pouvez aussi songer a remplacer votre curseur par une boucle utilisant une table temporaire du genre:

    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
     
    Declare @i int --compteur
     
    SELECT row_number() over (order by dept_id, dept_name) as id, dept_id, dept_name
    into #tempTable
    FROM departments
    WHERE location = @location
     
    select @i = max(id) from #tempTable
     
    while @i > 0
    begin
        select @dept_id = dept_id, @dept_name = dept_name from #tempTable where id = @i
     
       -- Traitement
     
       set @i = @i - 1
    end
     
    drop #tempTable
    Selon les curseurs utilises, s'ils sont du cote serveur, vous risquez des soucis lors des rebuilds d'index.

  5. #5
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut Du code ...
    Bon, le plus simple c'est que tu nous montres le code d'ouverture du curseur
    (depuis le declare cur1 cursor FOR ... jusqu'au premier FETCH ... INTO)
    Comme ça on verra tout de suite s'il y a quelque chose qui cloche.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Le plus simple c'est surtout d'écrire du code SQL, et les curseurs ne sont pas du SQL.
    SQL est un langage déclaratif, par procédural : on ne doit pas dicter au moteur de base de données comment il doit stocker ou récupérer les données.
    Or c'est ce que fait un curseur.
    Ensuite un curseur n'est pas ensembliste, c'est à dire qu'il traite les tuples un à un au lieu de les traiter dans leur globalité. SQL est un langage ensembliste.

    Je rejoins donc Népomucène : donnez-nous votre code, et nous verrons comment le transformer en véritable code SQL.

    @++

Discussions similaires

  1. Requette Sql Backup Avec parametre dans un Dts
    Par Hinou dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/12/2008, 12h49
  2. Web service natif SQL server avec parametre
    Par karngates dans le forum Services Web
    Réponses: 0
    Dernier message: 07/11/2008, 10h48
  3. job SQL Server avec parametres
    Par Knightrider76 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 07/06/2007, 13h13
  4. requete SQL: where avec parametre variable
    Par dracula2000 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 06/05/2006, 22h46
  5. [PL/SQL] Curseur avec Paramètre
    Par blids dans le forum Oracle
    Réponses: 5
    Dernier message: 10/10/2004, 20h07

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