Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 26/09/2011, 17h57   #1
Membre habitué
 
Avatar de sihammaster
 
Webmaster
Inscription : mai 2009
Messages : 238
Détails du profil
Informations professionnelles :
Activité : Webmaster
Secteur : Finance

Informations forums :
Inscription : mai 2009
Messages : 238
Points : 148
Points : 148
Envoyer un message via MSN à sihammaster
Par défaut Les Procédures Stockées

Bonjour,
je voudrais savoir s'il est possible de faire une boucle FOR dans une procedure stockée sous SQLServer 2008, si oui je vous pris de me donner un exemple, Merci.
sihammaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 18h01   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 958
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 958
Points : 17 789
Points : 17 789
Pas de FOR, mais du WHILE (qui peut simuler du FOR) !

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 26/09/2011, 18h23   #3
Membre habitué
 
Avatar de sihammaster
 
Webmaster
Inscription : mai 2009
Messages : 238
Détails du profil
Informations professionnelles :
Activité : Webmaster
Secteur : Finance

Informations forums :
Inscription : mai 2009
Messages : 238
Points : 148
Points : 148
Envoyer un message via MSN à sihammaster
Merci,
En fait je voudrais faire un traitement un peu comliqué, j'ai pu le faire en VB.Net, et j'aimerais le refaire dans une procedure stockée.

voila un exemple:

Ticker MarketCap Date
A 120000 2011-09-22
A 230000 2011-09-24
A 677000 2011-09-25

dans une fenetre j'ai une liste des tickers (dans une chekedlistbox), l'utilisateur a le droit de cocher le nombre de ticker qu'il souhaite.
le principe c'est de calculer la performance de chaque ticker.
Pour le premier enregistrement doit tjrs affecter 1
dans les autres lignes il faut calculer la division de la ligne /la ligne -1.
Le resultat sera:
Date Perf
2011-09-22 1
2011-09-24 230000/120000
2011-09-25 677000/230000.
Sans Boucle comment faire, Merci
sihammaster est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 27/09/2011, 08h50   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 958
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 958
Points : 17 789
Points : 17 789
En utilisant une fonction de fenêtrage dans une simple requête SQL, par exemple.

Démo :

Jeu d'essais :
Code :
1
2
3
4
5
6
7
8
9
10
CREATE TABLE MA_TABLE
(Ticker CHAR(1),
 MarketCap FLOAT,
 MaDate DATE);
 
INSERT INTO MA_TABLE
VALUES  
('A', 120000, '2011-09-22'),
('A', 230000, '2011-09-24'),
('A', 677000, '2011-09-25');
La requête :
Code :
1
2
3
4
5
6
7
8
9
WITH T AS
(SELECT *, ROW_NUMBER() OVER(PARTITION BY Ticker ORDER BY MaDate DESC) AS N
 FROM   MA_TABLE)
SELECT T1.Ticker, T1.MaDate, T1.MarketCap / COALESCE(T2.MarketCap, T1.MarketCap)
FROM   T AS T1
       LEFT OUTER JOIN T AS T2 
            ON T1.Ticker = T2.Ticker
               AND T1.N = T2.N - 1
ORDER BY 1, 2
1) appeler une colonne "DATE" est franchement stupide. C'est un mot clef réservé de SQL et ne peut que vous conduire à des ennuis !
2) pour apprendre SQL, rien ne vaut mon site ou mon livre.
En particulier :
a) sur les CTE (WITH) : http://sqlpro.developpez.com/cours/s...te-recursives/
b) sur les fonctions de fenêtrage : http://sqlpro.developpez.com/article...clause-window/

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 27/09/2011, 09h19   #5
Membre émérite
 
Homme Serge RUQUET
Consultant informatique
Inscription : août 2006
Messages : 669
Détails du profil
Informations personnelles :
Nom : Homme Serge RUQUET
Âge : 50
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2006
Messages : 669
Points : 840
Points : 840
SQL Pro...
On sent bien là le prof (ce n'est pas péjoratif, loin de là)
Je pense que sihammaster est un dev .net qui doit faire du SQL (comme beaucoup maintenant dans la vie courante) et que si tu commences à lui faire apprendre les cubes pour la seule requête complexe qu'il aura a écrire c'est un peu lourd; D'autant plus que si d'autres dev de sa boîte tombent sur un cube je pense qu'ils feront la même tête qu'une poule qui trouve une fourchette
Je pense qu'un petit curseur serait plus simple a comprendre.
Ou il faudrait que MS fasse des syntaxes simples du type Start With d'Oracle.

Bonne journée

PS: Avant que tu sautes sur ton fauteuil, je sais que la syntaxe d'Oracle n'est pas du SQL, mais il nous faut vivre avec notre temps ; c'est finit les DBA études qui ne faisaient que de l'"optimisation"....
__________________
Errare humanum est, perseverare diabolicum (Sénèque)
serge0934 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/09/2011, 11h50   #6
Membre habitué
 
Avatar de sihammaster
 
Webmaster
Inscription : mai 2009
Messages : 238
Détails du profil
Informations professionnelles :
Activité : Webmaster
Secteur : Finance

Informations forums :
Inscription : mai 2009
Messages : 238
Points : 148
Points : 148
Envoyer un message via MSN à sihammaster
Bonjour,
Merci infiniment ca marche nickel!!!!!, vraiment vous etes le MASTER SQLPRO.
Merci bcp serge0934 tu m'a bien compris, je trouve le code .Net plus facile que les requetes complexes parce que je travaill bcp sur le code que sur les requetes.
Merci encore
sihammaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 12h27   #7
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Citation:
Envoyé par serge0934
Je pense qu'un petit curseur serait plus simple a comprendre.
Certes mais la démarche est totalement fausse, pour trois raisons :

- SQL est un langage ensembliste, donc il est conçu pour traiter les données dans leur ensemble et non ligne à ligne
- SQL est un langage déclaratif, donc on ne spécifie par comment on veut obtenir un résultat, mais seulement ce que l'on souhaite obtenir, horizontalement et verticalement.
- les curseurs sont terriblement contre-performants.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 13h12   #8
Membre émérite
 
Homme Serge RUQUET
Consultant informatique
Inscription : août 2006
Messages : 669
Détails du profil
Informations personnelles :
Nom : Homme Serge RUQUET
Âge : 50
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2006
Messages : 669
Points : 840
Points : 840
je suis d'accord avec toi Elsuket....
mais cela fait 27 ans que je fait du SQL, j'ai commencé chez Sybase a Dallas en 1984, je dois en être a plus de 100 missions en temps que DBA architecte ETUDES, cad que je cotoie des petits jeunes dev pour qui le SQL est un monde à part et je vois bien que depuis une dizaine d'années, ils ne savent même plus ce qu'est un UAR (unité arithmétique et logique) car avec des langages comme Java, il ne savent plus ce qui se passent dans un processeur.
Actuellement je bosse pour une société qui a délocalisé le dev SQL de son ERP dans le Sud est asiatique; on reçoit des packages SSIS pour connecter a BO avec des cubes en pagaille, résultat, personne a part moi ne comprends. Voila ce que je voulais exprimer.

J'ai même vu, pour des chargements de fichier plat, des dev qui permettaient de charger les lignes correctes et qui "sautaient" les lignes incorrectes => je te laisse penser au résultat

PS: je regarde encore beaucoup vos articles a SQLpro et toi même car ils sont très bien fait; cela me fait de l'autoformation car les formations MS que j'ai suivi ne m'ont pas apportées grand choses.
__________________
Errare humanum est, perseverare diabolicum (Sénèque)
serge0934 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 14h01   #9
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 958
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 958
Points : 17 789
Points : 17 789
Citation:
Envoyé par serge0934 Voir le message
... si tu commences à lui faire apprendre les cubes pour la seule requête complexe qu'il aura a écrire c'est un peu lourd....
La requête présentée n'a rien à voir avec la notion de cube d'aucune sorte ni d'aucune manière que ce soit, et reste la solution la plus performante à long terme.

je pense qu'après 27 ans de SQL, vous auriez peut être besoin d'un léger rafraichissement !

;-)

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 27/09/2011, 17h43   #10
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Citation:
Envoyé par serge0934
je suis d'accord avec toi Elsuket....
mais cela fait 27 ans que je fait du SQL, j'ai commencé chez Sybase a Dallas en 1984, je dois en être a plus de 100 missions en temps que DBA architecte ETUDES, cad que je cotoie des petits jeunes dev pour qui le SQL est un monde à part et je vois bien que depuis une dizaine d'années, ils ne savent même plus ce qu'est un UAR (unité arithmétique et logique) car avec des langages comme Java, il ne savent plus ce qui se passent dans un processeur.
Actuellement je bosse pour une société qui a délocalisé le dev SQL de son ERP dans le Sud est asiatique; on reçoit des packages SSIS pour connecter a BO avec des cubes en pagaille, résultat, personne a part moi ne comprends. Voila ce que je voulais exprimer.
Mes respects pour les 27 ans et pour votre carrière, j'espère que je pourrai en faire autant que vous.
Je n'ai pas prétendu vous apprendre ce qu'est SQL ni pourquoi il est conçu, mais s'il vous plaît, ne conseillez pas les curseurs !
Je suis sûr que vous savez tout comme moi que même un WHILE est moins moche.

Citation:
J'ai même vu, pour des chargements de fichier plat, des dev qui permettaient de charger les lignes correctes et qui "sautaient" les lignes incorrectes => je te laisse penser au résultat
Je crois que sur ce forum on a tous un peu été face à des situations aberrantes. Au début ça saoule, après on en rigole et on essaie de montrer aussi largement que possible qu'on peut faire mieux et plus simple

Citation:
PS: je regarde encore beaucoup vos articles a SQLpro et toi même car ils sont très bien fait; cela me fait de l'autoformation
Merci pour l'encouragement

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 22h33   #11
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Je pense que sihammaster est un dev .net qui doit faire du SQL (comme beaucoup maintenant dans la vie courante) et que si tu commences à lui faire apprendre les cubes pour la seule requête complexe qu'il aura a écrire c'est un peu lourd;
Quel rapport avec les cubes?
C'est une simple fonction de fenêtrage...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h40.


 
 
 
 
Partenaires

Hébergement Web