Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/07/2008, 23h38   #1
Invité de passage
 
Inscription : juillet 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 6
Points : 1
Points : 1
Par défaut Comment placer une requete SQL dans un curseur avec une variable (SQL SERVER 2005) ?

Microsoft SQL SERVER 2005

Code :
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
Deathunt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2008, 10h02   #2
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 782
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 782
Points : 1 853
Points : 1 853
Ça serait sympa de mettre cela dans des balises CODE, de développer un peu la question, enfin être courtois....
Jinroh77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2008, 15h11   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 792
Points : 17 792
Vous pouvez faire un curseur en SQL dynamique.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2008, 16h49   #4
Invité de passage
 
Inscription : juillet 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 6
Points : 1
Points : 1
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
Deathunt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2008, 08h13   #5
Expert Confirmé
 
Avatar de rudib
 
Inscription : mai 2006
Messages : 2 236
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2006
Messages : 2 236
Points : 2 983
Points : 2 983
Envoyer un message via ICQ à rudib Envoyer un message via MSN à rudib
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
Consultant indépendant
modélisation, administration, optimisation, formation,
solutions MS SQL Server et informatique libre.
MCDBA, MCITP, MCT, SCJP2 - http://www.babaluga.com/
Articles et tutoriels : http://rudi.developpez.com/
LIVRE : Optimiser SQL Server
rudib est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2008, 17h04   #6
Invité de passage
 
Inscription : juillet 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 6
Points : 1
Points : 1
Voir
raison#1
raison#2

en commentaire dans le code

Code :
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
Deathunt est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h07.


 
 
 
 
Partenaires

Hébergement Web