2010-01-28 6 views
1

j'ai un SP qui exécute 1 SP au momentObtenez l'ID sélectionné dans un SP exécuté dans un autre SP

EXEC mpSPAccess.PostIdSelect @PostDate = @TodaysDate 

Le SP fait quelque chose comme ça (très simplyfied :))

SELECT id FROM Post WHERE DateCreated = @PostDate 

Après ce SP est Exécuté je veux utiliser l'id je suis arrivé de PostIdSelect comme paramètre pour plus SPs comme ceci:

EXEC mpSPAccess.GetSomethingWithThePostIdSelect @PostId = @PostIdFromTheFirstSpSELECT 
EXEC mpSPAccess.GetAnotherSomethingWithThePostIdSelect @PostId = @PostIdFromTheFirstSpSELECT 

est-ce possible d'une certaine manière?

Répondre

2

Vous pouvez simplement configurer votre PostIdSelect proc stocké pour retourner un int ou quel que soit le paramètre de sortie approprié représentant l'ID que vous sélectionnez, nourrissez que vos autres procs, quelque chose comme:

CREATE PROCEDURE PostIdSelect 

    @PostDate datetime, 
    @PostId int OUTPUT 

AS 

SELECT @PostID = id FROM Post WHERE DateCreated = @PostDate 

GO 

ensuite d'utiliser cette ,

DECLARE @OutputID int 

EXEC PostIdSelect '1/28/2010', @OutputID 

SELECT @OutputID -- Optional, just to view the resulting output ID 

EXEC GetSomethingWithThePostIdSelect @PostID = @OutputID 

Une note, avec votre déclaration initiale SELECT, vous voulez probablement utiliser SELECT TOP 1 ID ou quelque chose pour éviter que plusieurs valeurs d'être de retour, à moins que vous êtes certain que DateCreated sera unique à chaque enregistrement dans le ta ble.

+1

devrait être SELECT @PostId = id de Postes OÙ DateCreated = @PostDate ?? –

+1

N'oubliez pas d'affecter l'ID à @PostId dans le sproc PostIdSelect :) .... SELECT @PostId = id FROM Post WHERE DateCreated = @PostDate. Le point DateCreated fait est également crucial, d'accord avec cela – AdaTheDev

+0

"Syntaxe incorrecte près '='." Lorsque j'essaie de CHOISIR @PostId = id FROM Post WHERE DateCreated = @PostDate, cela ne semble pas fonctionner, pourquoi? – Marcus

0

Etant donnée une procédure stockée comme vous indiqué:

CREATE PROCEDURE PostIdSelect 
    @PostDate datetime 
AS 
SELECT id FROM Post WHERE DateCreated = @PostDate 

Ceci peut être utilisé sans modification en capturant l'ensemble de lignes dans une table:

DECLARE @PostID int 
CREATE TABLE #PostIDs (PostID int) 
INSERT #PostIDs EXEC PostIdSelect @TodaysDate 
SELECT @PostID = TOP 1 PostID FROM #PostIDs 
-- use @PostID 

Une autre façon de le faire, si vous voulez toujours retourner une seule ligne, est d'utiliser un paramètre de sortie, ce qui nécessite de modifier votre procédure stockée:

CREATE PROCEDURE PostIdSelect2 
    @PostDate datetime, 
    @PostID int OUT 
AS 
SELECT TOP 1 @PostID = id FROM Post WHERE DateCreated = @PostDate 

en utilisant comme ceci:

DECLARE @PostID int 
EXEC PostIdSelect2 @TodaysDate, @PostID OUT 
-- use @PostID 

Notez que avec ces deux méthodes, vous ne pouvez pas passer sous silence l'idée qu'il pourrait y avoir plusieurs PostIDs. Avec la première méthode d'insertion de table, vous pouvez faire quelque chose avec chaque ligne individuellement, ou même vous joindre à la table. Il serait préférable de joindre à la table, mais si vous devez faire quelque chose avec chaque ligne individuellement, un curseur en lecture seule est plus rapide que vous-même.