获取在其他SP中执行的SP中选择的ID

时间:2010-01-28 13:39:35

标签: sql-server tsql stored-procedures

我有一个SP,目前执行1 SP

EXEC mpSPAccess.PostIdSelect @PostDate = @TodaysDate

SP做了这样的事情(非常简单:) :)

SELECT id FROM Post WHERE DateCreated = @PostDate

在此SP执行后,我想使用从PostIdSelect获取的id作为更多SP的参数,如下所示:

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

这有可能吗?

2 个答案:

答案 0 :(得分:2)

您可以设置PostIdSelect存储过程以返回一个int或任何适当的输出参数来表示您选择的ID,然后将其提供给您的其他过程,如:

CREATE PROCEDURE PostIdSelect

     @PostDate datetime,
     @PostId int OUTPUT

AS

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

GO

然后利用它,

DECLARE @OutputID int

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

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

EXEC GetSomethingWithThePostIdSelect @PostID = @OutputID

注意,使用您的初始SELECT语句,您可能希望使用SELECT TOP 1 ID或其他东西来阻止返回多个值,除非您确定DateCreated对于表中的每个记录都是唯一的。< / p>

答案 1 :(得分:0)

根据您指示的存储过程:

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

通过将行集捕获到表中,可以不加修改地使用它:

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

另一种方法是,如果你总是只返回一行,那就是使用输出参数,这需要修改你的存储过程:

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

像这样使用它:

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

请注意,使用这两种方法,您无法掩盖可能存在多个PostID的想法。使用第一个表插入方法,您可以单独对每一行执行某些操作,甚至可以连接到表。最好是尽可能加入表,但如果你必须单独对每一行做一些事情,那么快进的只读光标实际上比循环自己更快。