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 :

Curseur sous SQLserver


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 120
    Par défaut Curseur sous SQLserver
    Bonjour,

    J'ai deux tables:

    une première "section"
    une seconde "livre"
    chaque section contient des livres.

    dans "section", il y a un attribut nbmax.

    Je souhaite récupérer un nombre (nbmax) de livre par section et tiré au hasard.

    Mon problème est que je reste toujours dans la même section

    Merci de votre aide.

    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
    DECLARE @nosection int
    DECLARE @nbmax int 
    DECLARE Section_Cursor CURSOR FOR
    	SELECT nbmax, nosection FROM sections
     
    OPEN Section_Cursor
    FETCH Section_Cursor INTO @nbmax, @nosection
     
    WHILE @@FETCH_STATUS = 0
    	BEGIN
    		SELECT TOP(@nbmax) * FROM livres where nosection = @nosection ORDER BY newid()
    		FETCH NEXT FROM Section_Cursor
    	END
     
    CLOSE Section_Cursor
    DEALLOCATE Section_Cursor

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Normale, seule la dernière requête SELECT est visible. Si vous voulez faire cela il y a deux solutions :
    1) faire une union dans une table temporaire et un select final
    2) virer votre procédure qui ne sert à rien et faire le tout en une seule requête via CTE et fonctions de fenêtrage.

    A lire : http://sqlpro.developpez.com/cours/s...te-recursives/
    http://sqlpro.developpez.com/SQL_Server_2K5/N1.php
    paragraphe 1.7

    Sans plus de précision sur la description de vos tables sous forme DDL comme demandé dans les règles du forums, il est difficvile de vous aider :
    http://www.developpez.net/forums/d96...vement-poster/

    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/ * * * * *

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 120
    Par défaut
    sorry, je vais essayer d'être plus précis sur mon objectif...

    voici les tables (j'en ajoute une autre... explications ci dessous)

    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
     
    create table sections(
    	nosection int identity(1,1) constraint pk_sections primary key,
    	position int not null,
    	nbmax int not null
    );
     
    create table livre(
    	nolivre int identity(1,1) constraint pk_questions primary key,
    	nosection int not null,
    	position int not null,
    	commentaire nvarchar(255) not null,
    	image nvarchar(255)
    );
     
    create table suivis(
    	nosuivi int identity(1,1) constraint pk_suivis primary key,
    	nolivre int not null,
    	marque bit not null
    );
     
    -----clés étrangères------
    alter table livres
    	add constraint fk_questions_section foreign key(nosection) references sections(nosection);
     
    alter table suivis
    	add constraint fk_suivis_questions foreign key(nolivre) references questions(nolivre);

    en fait, au milieu de ma boucle while, je souhaite récupérer les infos du select pour insérer le livre (nolivre) dans la table suivi...

    le but étant que le tirage au sort de nbmax livres de la section vienne s'ajouter à la table suivis...

    l'idée est d'avoir une procédure stockée pour un programme derrière...

    peut être je ne suis pas assez clair...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 120
    Par défaut
    J'ai modifié la ligne faisant avancé le curseur à la fin du while et je change bien de section... pour ça, ça fonctionne

    J'ai essayé d'insérer mais TOP doit retourner toutes les colonnes... donc j'ai utilisé une sous requete pour récupérer la valeur à insérer... mais j'ai une erreur vers vers FETCH (en fin de boucle while)

    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 @nosection int
    DECLARE @nbmax int 
    DECLARE Section_Cursor CURSOR FOR
    	SELECT nbmax, nosection FROM sections
     
    DECLARE @noli int
     
    OPEN Section_Cursor
    FETCH Section_Cursor INTO @nbmax, @nosection
     
    WHILE @@FETCH_STATUS = 0
    	BEGIN
    SELECT @noli = nolivre from
    		(SELECT TOP(@nbmax) * FROM livres WHERE nosection = @nosection ORDER BY newid() )
                   INSERT INTO Suivis(nolivre, marque) VALUES (@noli, 'false')
    		FETCH Section_Cursor INTO @nbmax, @nosection
    	END
     
    CLOSE Section_Cursor
    DEALLOCATE Section_Cursor

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 120
    Par défaut
    J'ai également essayé l'insertion des lignes dans la tables suivis en imbriquant 2 curseurs... ça marche pôs...

    Je crois que je vais passer par 2 requetes appelées au niveau logiciel et non dans la base de données...

  6. #6
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 2
    Par défaut Test avec cette modification
    FETCH Section_Cursor INTO @nbmax, @nosection

    FETCH NEXT FROM Section_Cursor INTO @nbmax, @nosection

    Citation Envoyé par redwire Voir le message
    Bonjour,

    J'ai deux tables:

    une première "section"
    une seconde "livre"
    chaque section contient des livres.

    dans "section", il y a un attribut nbmax.

    Je souhaite récupérer un nombre (nbmax) de livre par section et tiré au hasard.

    Mon problème est que je reste toujours dans la même section

    Merci de votre aide.

    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
    DECLARE @nosection int
    DECLARE @nbmax int 
    DECLARE Section_Cursor CURSOR FOR
    	SELECT nbmax, nosection FROM sections
     
    OPEN Section_Cursor
    FETCH Section_Cursor INTO @nbmax, @nosection
     
    WHILE @@FETCH_STATUS = 0
    	BEGIN
    		SELECT TOP(@nbmax) * FROM livres where nosection = @nosection ORDER BY newid()
    		FETCH NEXT FROM Section_Cursor
    	END
     
    CLOSE Section_Cursor
    DEALLOCATE Section_Cursor

Discussions similaires

  1. [ASE12][TSQL]Curseur sous Sybase
    Par jeff37 dans le forum Sybase
    Réponses: 4
    Dernier message: 15/01/2007, 17h42
  2. Créer des utilisateurs et des groupes(droits) sous SqlServer
    Par shako95 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/11/2005, 07h57
  3. Erreur de lecture du flux sous SQLServer
    Par smazaudi dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/03/2005, 14h30
  4. Réponses: 3
    Dernier message: 19/11/2004, 15h48

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