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 :

Comment placer une requete SQL dans un curseur avec une variable (SQL SERVER 2005) ?


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Comment placer une requete SQL dans un curseur avec une variable (SQL SERVER 2005) ?
    Microsoft SQL SERVER 2005

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DECLARE @SQLString nvarchar(4000);
     
    --ASSIGNE UNE REQUETE SQL DANS UNE STRING
    SET @SQLString=N' tb_CONTRAT.PK_ID_CONTRAT, tb_CLIENT.TEL_RES
    	FROM tb_CLIENT INNER JOIN
    		tb_CONTRAT ON tb_CLIENT.ID_CLIENT = tb_CONTRAT.FK_ID_CLIENT AND 
    		tb_CLIENT.FK_NO_FRANCH = tb_CONTRAT.FK_NO_FRANCH'
     
    --PLACER LA REQUETE SQL DANS UN CURSEUR, EST-CE POSSIBLE ?
    DECLARE cListeClient CURSOR FOR
    	SELECT @SQLString

  2. #2
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Ça serait sympa de mettre cela dans des balises CODE, de développer un peu la question, enfin être courtois....
    Alexandre Chemla - Consultant MS BI chez Masao

  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 782
    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 782
    Points : 52 783
    Points
    52 783
    Billets dans le blog
    5
    Par défaut
    Vous pouvez faire un curseur en SQL dynamique.

    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Vous pouvez faire un curseur en SQL dynamique.

    A +
    SQL dynamique ?

    Au fait je suis en Microsoft SQL SERVER 2005

  5. #5
    Expert confirmé
    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
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    Ce que veut dire SQLPro, c'est de mettre le tout dans un varchar, et d'exécuter la chaîne avec un EXEC(), ce qu'on appelle du SQL dynamique.

    Le plus intelligent serait de décrire ce que vous voulez obtenir (quels sont vos besoins fonctionnels), pour qu'on vous explique comment vous passer d'un curseur, ce qui est certainement possible. Apprenez à ne pas faire de curseur. Il y a un article de SQLPro sur le sujet : http://sqlpro.developpez.com/cours/s...r_avoidCursor/
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Voir
    raison#1
    raison#2

    en commentaire dans le 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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    CREATE PROCEDURE [dbo].[sto_rptListeClientNonRenouveller]
    (
    @idFranchise int,	--OBL identification de la franchise
    @anneeCourante int,	--OBL année de contrat du traitement
    @ordreTri nvarchar(10),	--telephone, nom, secteur
    @contraAnnulerInclu bit	--1=oui, 0=non, null=nonInclus	Si on inclu les contras annuler
    )
    AS
    	CREATE TABLE #tbClientNonRenouveller(
    		TEL_RES nvarchar(8) NOT NULL,
    		NOM nvarchar(50) NOT NULL,
    		PRENOM nvarchar(50) NOT NULL,
    		NO_CIVIC nvarchar(10) NOT NULL,
    		RUE nvarchar(50) NOT NULL,
    		VILLE nvarchar(50) NOT NULL,
    		CODE_POST nvarchar(7) NOT NULL,
    		NO_SECT nvarchar(10) NOT NULL,
    		SOLDE float NOT NULL,
    		lstAnneeCont nvarchar(50) NOT NULL,
    		nbContrat int NOT NULL
    	)
     
    	IF @contraAnnulerInclu =0 OR @contraAnnulerInclu IS NULL
    		DECLARE cListeClient CURSOR FOR
    			SELECT CLIENT.ID_CLIENT, CLIENT.TEL_RES, CLIENT.NOM, CLIENT.PRENOM, CLIENT.NO_CIVIC, 
    				CLIENT.RUE, CLIENT.VILLE, CLIENT.CODE_POST, CLIENT.NO_SECT, CLIENT.SOLDE
    			FROM CLIENT INNER JOIN
    				CONTRAT ON CLIENT.ID_CLIENT = CONTRAT.ID_CLIENT AND 
    				CLIENT.NO_FRANCH = CONTRAT.NO_FRANCH
    			WHERE CONTRAT.NO_FRANCH =@idFranchise
    			AND CONTRAT.ANNEE_CONTRAT =@anneeCourante-1
    			AND CONTRAT.ID_CONTRAT NOT IN(
    				/*Liste de client annee courante*/
    				SELECT CONTRAT.ID_CONTRAT
    				FROM CLIENT INNER JOIN
    					CONTRAT ON CLIENT.ID_CLIENT = CONTRAT.ID_CLIENT AND 
    					CLIENT.NO_FRANCH = CONTRAT.NO_FRANCH
    				WHERE CONTRAT.NO_FRANCH =@idFranchise
    				AND CONTRAT.ANNEE_CONTRAT =@anneeCourante)
    			/*Contra annuler non inclu*/
    			AND CONTRAT.ID_CONTRAT NOT IN(
    				SELECT CA.ID_CONTRAT
    				FROM CONTRAT_ANN AS CA	--TODO Ajouter critere DATE pour filtrer & ameliorer la performance
    				WHERE CA.NO_FRANCH =@idFranchise)
    			/*Contra annuler non inclu*/
    			GROUP BY CLIENT.ID_CLIENT, CLIENT.TEL_RES, CLIENT.NOM, CLIENT.PRENOM, CLIENT.NO_CIVIC,
    				CLIENT.RUE, CLIENT.VILLE, CLIENT.CODE_POST, CLIENT.NO_SECT, CLIENT.SOLDE
    	ELSE
    		/*copier coller sans la section "Contra annuler non inclu",
    		ca serait bien de reussir a placer ca dans une variable et
    		que le curseur puisse utiliser cette variable*/
    		DECLARE cListeClient CURSOR FOR
    			SELECT CLIENT.ID_CLIENT, CLIENT.TEL_RES, CLIENT.NOM, CLIENT.PRENOM, CLIENT.NO_CIVIC, 
    					CLIENT.RUE, CLIENT.VILLE, CLIENT.CODE_POST, CLIENT.NO_SECT, CLIENT.SOLDE
    			FROM CLIENT INNER JOIN
    				CONTRAT ON CLIENT.ID_CLIENT = CONTRAT.ID_CLIENT AND 
    				CLIENT.NO_FRANCH = CONTRAT.NO_FRANCH
    			WHERE CONTRAT.NO_FRANCH =@idFranchise
    			AND CONTRAT.ANNEE_CONTRAT =@anneeCourante-1
    			AND CONTRAT.ID_CONTRAT NOT IN(
    				/*Liste de client annee courante*/
    				SELECT CONTRAT.ID_CONTRAT
    				FROM CLIENT INNER JOIN
    					CONTRAT ON CLIENT.ID_CLIENT = CONTRAT.ID_CLIENT AND 
    					CLIENT.NO_FRANCH = CONTRAT.NO_FRANCH
    				WHERE CONTRAT.NO_FRANCH =@idFranchise
    				AND CONTRAT.ANNEE_CONTRAT =@anneeCourante)
    			GROUP BY CLIENT.ID_CLIENT, CLIENT.TEL_RES, CLIENT.NOM, CLIENT.PRENOM, CLIENT.NO_CIVIC,
    			CLIENT.RUE, CLIENT.VILLE, CLIENT.CODE_POST, CLIENT.NO_SECT, CLIENT.SOLDE
     
    	DECLARE @ID_CLIENT int
    	DECLARE @TEL_RES nvarchar(8)
    	DECLARE @NOM nvarchar(50)
    	DECLARE @PRENOM nvarchar(50)
    	DECLARE @NO_CIVIC nvarchar(10)
    	DECLARE @RUE nvarchar(50)
    	DECLARE @VILLE nvarchar(50)
    	DECLARE @CODE_POST nvarchar(7)
    	DECLARE @NO_SECT nvarchar(10)
    	DECLARE @SOLDE float
    	DECLARE @lstAnneeCont nvarchar(50)
    	DECLARE @nbContrat int
    BEGIN
     
    	OPEN cListeClient
    	FETCH NEXT FROM cListeClient INTO @ID_CLIENT, @TEL_RES, @NOM, @PRENOM,
    		@NO_CIVIC, @RUE, @VILLE, @CODE_POST, @NO_SECT, @SOLDE
     
    	WHILE (@@FETCH_STATUS=0)
    	BEGIN
    		SET @nbContrat=0
    		SET @lstAnneeCont=''
     
    		/*Raison #1 curseur, compter le nombre de contra qu'un client possede*/
    		SET @nbContrat=(
    			SELECT COUNT(CONTRAT.ID_CONTRAT)
    			FROM CONTRAT
    			WHERE CONTRAT.ID_CLIENT =@ID_CLIENT 
    			AND CONTRAT.NO_FRANCH =@idFranchise
    		)
    		/*Raison #2 curseur, Fonction qui renvoie les annees des contras d'un client*/
    		SET @lstAnneeCont =dbo.func_ListAnneeContrat(@ID_CLIENT)
     
    		/*Recupere nos 2 informations traités et le contenu du curseur,
    		on place tout ca dans une table qu'on fait afficher a la fin*/
    		INSERT INTO #tbClientNonRenouveller
    			SELECT @TEL_RES, @NOM, @PRENOM, @NO_CIVIC, @RUE, @VILLE,
    				@CODE_POST, @NO_SECT, @SOLDE, @lstAnneeCont, @nbContrat
     
    		FETCH NEXT FROM cListeClient INTO @ID_CLIENT, @TEL_RES, @NOM, @PRENOM,
    			@NO_CIVIC, @RUE, @VILLE, @CODE_POST, @NO_SECT, @SOLDE
    	END
     
    	CLOSE cListeClient
    	DEALLOCATE cListeClient
     
     
    	SELECT * FROM #tbClientNonRenouveller
     
    	DROP TABLE #tbClientNonRenouveller
    END

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/04/2009, 10h23
  2. Réponses: 2
    Dernier message: 30/06/2008, 10h20
  3. probléme avec une requete insert dans une procédure stockée
    Par amelhajer dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/05/2007, 11h03
  4. probleme avec une methode static dans le body d'une jsp
    Par amadou.deme dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 19/02/2007, 08h47
  5. [ORACLE][SQL] procedure sous delphi avec une requete SQL
    Par nivet dans le forum Bases de données
    Réponses: 2
    Dernier message: 17/11/2004, 13h43

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