Given a stored procedure like you indicated:
CREATE PROCEDURE PostIdSelect
@PostDate datetime
AS
SELECT id FROM Post WHERE DateCreated = @PostDate
This can be used without modification by capturing the rowset into a table:
DECLARE @PostID int
CREATE TABLE #PostIDs (PostID int)
INSERT #PostIDs EXEC PostIdSelect @TodaysDate
SELECT @PostID = TOP 1 PostID FROM #PostIDs
-- use @PostID
Another way to do this, if you will always be returning only a single row, is to use an output parameter, which requires modifying your stored procedure:
CREATE PROCEDURE PostIdSelect2
@PostDate datetime,
@PostID int OUT
AS
SELECT TOP 1 @PostID = id FROM Post WHERE DateCreated = @PostDate
using it like so:
DECLARE @PostID int
EXEC PostIdSelect2 @TodaysDate, @PostID OUT
-- use @PostID
Notice that with both of these methods, you can't gloss over the idea that there could be multiple PostIDs. With the first table-insertion method, you could do something with each row individually, or even join to the table. It would be best if at all possible to join to the table, but if you must do something with each row individually, a fast-forward read-only cursor is actually faster than looping yourself.