我有一个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
这有可能吗?
答案 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的想法。使用第一个表插入方法,您可以单独对每一行执行某些操作,甚至可以连接到表。最好是尽可能加入表,但如果你必须单独对每一行做一些事情,那么快进的只读光标实际上比循环自己更快。