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 15/12/2011, 17h04   #1
Invité de passage
 
Homme
Développeur .NET
Inscription : décembre 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2011
Messages : 28
Points : 0
Points : 0
Par défaut select imbriqué en appelant une procédure stockée à partir d'une procédure stockée

Bonjour,

Je voudrais faire un select imbriqué mais pour des raisons de modularité le faire en faisant une procédure stockée qui fait un select avec comme paramètre le tableau de résultat de l'appel d'une seconde procédure stockée appelée dans cette première.

en gros j'aurais une procédure 1 appelée par la procédure 2


la procédure 1 renverrait un tableau de int :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
CREATE PROCEDURE dbo.Table1
	(
		@id1 INT
		@ids(<truc pour avoir éventuellement une liste>) OUTPUT
	)
AS
SELECT      dbo.Table1.id2,
FROM        dbo.Table1	
WHERE	    dbo.Table1.id1 = @id1;
<truc qui écrit tous les dbo.Table1.id2 dans @ids>
la seconde fait un 2 eme select avec une clause where sur tous les résultats de l'appel de la première procédure stockée, et renvoie le tout.

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
 
CREATE PROCEDURE dbo.Table2
	(
		@id2 INT,
		@id  INT
	)
 
 
AS
	DECLARE @i INT 
	DECLARE @id1 INT
	DECLARE @ids(<truc pour avoir éventuellement une liste>) INT
        SET @id1 = id2
	EXECUTE MaBaseDeDonnée.dbo.MaProstock @id1, @ids OUTPUT
	GO
 
 
   WHILE @i <= datalength(@ids)
   BEGIN
 
	SELECT  dbo.Table2.id3,
	FROM    dbo.Table2	
	WHERE	dbo.Table2.id4 = @ids[i];
	i++
   END
sauriez vous si c'est possible et comment compléter cet exemple type pour qu'il fonctionne?
Merci à l'avance
bibouilles est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 23h02   #2
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 791
Points : 17 791
Plutôt que de faire une procédure faite une fonction table.

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 10
Vieux 19/12/2011, 15h28   #3
Invité de passage
 
Homme
Développeur .NET
Inscription : décembre 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2011
Messages : 28
Points : 0
Points : 0
Merci bien, maintenant que j'utilise une fonction table,

quand j'essaie d'appeler une procédure qui appelle une fonction table multiselect pour faire la même chose j'ai ce message d'erreur:

Msg*4121, Niveau*16, État*1, Procédure*La_Procedure, Ligne*7
Impossible de trouver la colonne "dbo" la fonction définie par l'utilisateur ou l'agrégat "dbo.IdList". Le nom pourrait également être ambigu.
que je mette "[La_Procedure]" , "[dbo].[La_Procedure]" ou "[Work].[dbo].[La_Procedure]" avec ou sans crochets

code généré par clic droit exécuter la procédure (SQLServer2008R2):
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
USE [Work]
GO
 
DECLARE	@return_value int
 
EXEC	@return_value = [dbo].[La_Procedure]
		@idR = 4
 
SELECT	'Return Value' = @return_value
 
GO
La_Procedure stoquée qui appel la fonction table:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
USE [Work]
GO
/****** Object:  StoredProcedure [dbo].[La_Procedure]    Script Date: 12/19/2011 14:54:45 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[La_Procedure]
	(
			@idR int
	)
AS
 
SELECT		DISTINCT dbo.EC.IdUser
 
FROM		dbo.EC			INNER JOIN
			dbo.List_C				ON dbo.EC.L	= dbo.List_C.L
WHERE		dbo.List_C.L
												IN
(
	dbo.La_Fonction_Table(@idR)
);

la fonction table:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
USE [Work]
GO
/****** Object:  UserDefinedFunction [dbo].[La_Fonction_Table]    Script Date: 12/19/2011 14:55:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[La_Fonction_Table](@idR int)
RETURNS @table_C TABLE (L int)
AS
	BEGIN
		INSERT INTO @table_C
		   	SELECT  dbo.RPC.L
 
	FROM    dbo.RPs				INNER JOIN
			dbo.RPC	ON RPs.idR			= dbo.RPC.idR
 
	WHERE	dbo.RPs.idR												= @idR;
	RETURN;
	END;
Par contre ce select imbriqué équivalent fonctionne (avec le même paramettre)


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
 
USE [Work]
GO
/****** Object:  StoredProcedure [dbo].[E_Get_FromJ]    Script Date: 12/19/2011 15:02:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Batch submitted through debugger: SQLQuery3.sql|7|0|C:\Users\J\AppData\Local\Temp\~vs53A.sql
ALTER PROCEDURE [dbo].[E_Get_FromJ]
	(
			@idR int
	)
AS
 
SELECT		DISTINCT dbo.EC.IdUser
 
FROM		dbo.EC			INNER JOIN
			dbo.List_C				ON dbo.EC.L	= dbo.List_C.L
WHERE		dbo.List_C.L
												IN
(
	SELECT  dbo.RPC.L
 
	FROM    dbo.RPs				INNER JOIN
			dbo.RPC	ON RPs.idR			= dbo.RPC.idR
 
	WHERE	dbo.RPs.idR												= @idR
);
sauriez vous que faire svp?
bibouilles est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 17h56   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 670
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 670
Points : 8 732
Points : 8 732
Bonjour,

Cela m'a l'air bien compliqué.
J'ai donc publié une fonction de table en ligne (plus performant qu'une fonction de table multi-instructions) qui permet d'obtenir l'ensemble des valeurs d'une chaîne contenant des valeurs séparées par des virgules.

Comme c'est une fonction table, comme la vôtre, vous pouvez donc écrire une jointure dessus.

D'autre part vous pouvez aussi utiliser l'opérateur APPLY avec une fonction table, ce qui permet de grouper les tables dans la clause FROM, mais ça, ce n'est pas réellement nécessaire.

@++
__________________
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 20/12/2011, 10h20   #5
Invité de passage
 
Homme
Développeur .NET
Inscription : décembre 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2011
Messages : 28
Points : 0
Points : 0
Merci, pour info mais la fonction table que je propose, avec un paramètre unique, me retourne un jeu d’enregistrement, son but est de constituer la deuxième partie de la requête imbriquée.
Je ne comprends tout simplement pas pourquoi j’ai affichage de :

Impossible de trouver la colonne "dbo" la fonction définie par l'utilisateur ou l'agrégat "dbo.IdList"

vers, me semble-il , la ligne :
Code :
1
2
 
ALTER PROCEDURE [dbo].[La_Procedure]
Le commentaire n’a pas l’ere d’etre pris en compte pour le comptage des ligne

Merci tout de même pour ta fonction je cherchait par ailleur justement aussit comment passer une liste ou un tableau
bibouilles est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 17h22   #6
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 670
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 670
Points : 8 732
Points : 8 732
Si je reviens à la première procédure stockée que vous avez donné, je pense qu'il va falloir que vous utilisiez du T-SQL dynamique.
C'est à dire que vous construisez la chaîne de requête dans une variable de type nvarchar, que vous passez en paramètre à la procédure stockée système sp_executesql, comme je l'ai montré ici et ici

@++
__________________
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 22/12/2011, 16h26   #7
Invité de passage
 
Homme
Développeur .NET
Inscription : décembre 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2011
Messages : 28
Points : 0
Points : 0
Honte a moi! c'est tout bêtement parce que j'avais mal appelé la fonction table, il faut l'appeler comme ça:
Code :
1
2
 
SELECT * FROM dbo.La_Fonction_Table(@idR)
merci à tous pour ces conseils et ces scripts ingénieux dont j'en aurais certainement bientôt l'utilité
bibouilles 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 05h17.


 
 
 
 
Partenaires

Hébergement Web