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

MS SQL Server Discussion :

select imbriqué en appelant une procédure stockée à partir d'une procédure stockée


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 64
    Points : 38
    Points
    38
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
    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

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 858
    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 858
    Points : 52 996
    Points
    52 996
    Billets dans le blog
    6
    Par défaut
    Plutôt que de faire une procédure faite une fonction table.

    A +

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 64
    Points : 38
    Points
    38
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
    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 : 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
     
    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 : 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
     
    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?

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    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.

    @++

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 64
    Points : 38
    Points
    38
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    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

    @++

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 64
    Points : 38
    Points
    38
    Par défaut
    Honte a moi! c'est tout bêtement parce que j'avais mal appelé la fonction table, il faut l'appeler comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/10/2010, 11h46
  2. Réponses: 6
    Dernier message: 08/09/2010, 17h25
  3. Réponses: 2
    Dernier message: 05/03/2010, 14h15
  4. Appel de procedure a partir d'une procédure
    Par MrEddy dans le forum SQL
    Réponses: 1
    Dernier message: 25/07/2007, 18h34
  5. Réponses: 3
    Dernier message: 10/04/2007, 13h53

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