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 06/06/2011, 13h31   #1
Membre du Club
 
Développeur informatique
Inscription : juin 2006
Messages : 124
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juin 2006
Messages : 124
Points : 68
Points : 68
Envoyer un message via Skype™ à CAMIC
Par défaut Procédure stockée dans une boucle

Bonjour,

je sèche depuis un sacré bout de temps et je n'arrive pas à lancer une procédure stocké dans une boucle!

Ma procédure stockée me retourne de 0 à plusieurs lignes d'un ensemble de tables en fonction des paramètres que je lui passe.

J'aimerais obtenir pour chaque ligne d'une autre table la liste des lignes retournée par la procédure stockée. Comment faire!

En gros

Pour chaque Id de la table1

cumuler les résultat de EXECUTE MaProcedure Id, 0, 0

Merci d'avance

Philippe
CAMIC est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 15h13   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Citation:
la liste des lignes retournée par la procédure stockée
A première vue, c'est plutôt une fonction table qu'il vous faut !

Que fait votre procédure stockée ?

Vous aurez de meilleurs performances en évitant d'appeler des procédure dans une boucle. Faites tout en une seule requête !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 15h44   #3
Membre du Club
 
Développeur informatique
Inscription : juin 2006
Messages : 124
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juin 2006
Messages : 124
Points : 68
Points : 68
Envoyer un message via Skype™ à CAMIC
Bonjour

Voici un bout de code!
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
DECLARE @AnId bigint
 
CREATE TABLE #TableOut  (animal_id bigint, var2 nvarchar(32), var3 nvarchar(32) )
 
???????
SELECT @AnId = animal_id FROM dbo.sgpa_animals
???????
 
	BEGIN
		INSERT INTO #TableOut EXECUTE AnimalNamesFromAnimalId @AnId,0,0
	END
 
?????
?????
 
SELECT * FROM #TableOut

Ma procédure n'est appelée qu'une fois!

Philippe
CAMIC est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 16h24   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
A en croire le nom de la procédure stockée, celle-ci vous renvoi le nom d'un animal, en fonction de son ID...

Pourquoi ne pas aller le chercher directement dans la table depuis votre requête initiale ?

Y a-t-il un traitement particulier qui est effectué dans l'une de vos SP ?

Je pense aussi que vous pouvez (devriez) vous passer de votre table temporaire
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 16h26   #5
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
Bonjour,

Jusque-là cela semble normal, étant donné qu'il n'y a pas de boucle

En outre, l'utilisation d'un nvarchar est elle requise ?
Ce type utilise Unicode, qui stocke les caractères de n'importe quel alphabet sur deux octets ...
Mais si ne stockez que des caractères de l'alphabet latin et des chiffres arabes, alors le type varchar suffit amplement.
En effet, ce dernier utilise ASCII pour stocker un caractère sur un octet ... mais ne prend en charge que les caractères latins

Généralement l'utilisation d'une table temporaire peut s'éviter par l'écriture d'une seule requête, ou encore par l'utilisation d'expressions de table commune.
Si ces deux possibilités ne sont pas implémentables, il 'agit alors d'un problème de modélisation.

Donnez donc votre boucle, votre table, et un jeu de données, que nous voyions plus en détails ce que voulez faire

@++
__________________
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 06/06/2011, 17h23   #6
Membre du Club
 
Développeur informatique
Inscription : juin 2006
Messages : 124
Détails du profil
Informations personnelles :
Localisation : Suisse

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juin 2006
Messages : 124
Points : 68
Points : 68
Envoyer un message via Skype™ à CAMIC
Bonjour,

J'ai plusieurs tables dans mon projet.

Dans le cas présent, j'ai une table qui contient tout les animaux d'un refuge et une autre table qui contient un historique du changement de nom de chaque animal.

Donc ma procédure stockée retourne pour chaque Id valable, de un à plusieurs noms avec la date du changement de nom. Donc si un animal à changé trois fois de nom dans sa vie, j'aurai 3 noms.

Pour faire de la "name completion", j'ai besoin de connaitre tout les noms différents qui se trouve dans la base selon des critères.

Donc, j'aimerai parcourir la table animal, de prendre l'id de chaque animal pour le donner comme argument à ma procédure stockée.

Philippe
CAMIC est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 17h30   #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
Cela me semble inutile puisqu'il vous suffit de faire une jointure entre la table animal et la table historique animal ...

Cherchez vous à spécifier une liste d'identifiants / noms ?
Si tel est le cas, une seule requête dans une seule procédure stockée suffit

@++
__________________
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
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h59.


 
 
 
 
Partenaires

Hébergement Web