Получить идентификатор, выбранный в SP, выполненном в другом SP - PullRequest
1 голос
/ 28 января 2010

У меня есть SP, который в данный момент выполняет 1 SP

EXEC mpSPAccess.PostIdSelect @PostDate = @TodaysDate

SP делает что-то вроде этого (очень просто :))

SELECT id FROM Post WHERE DateCreated = @PostDate

После того, как этот SP будет выполнен, я хочу использовать идентификатор, полученный из PostIdSelect, в качестве параметра для большего количества SP. Вот так:

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

Возможно ли это как-нибудь?

Ответы [ 2 ]

2 голосов
/ 28 января 2010

Вы можете просто настроить свой сохраненный процесс PostIdSelect для возврата целого или любого другого выходного параметра, представляющего выбранный вами идентификатор, а затем передать его другим процессам, что-то вроде:

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 будет уникальным для каждой записи в таблице.

0 голосов
/ 29 января 2010

Учитывая хранимую процедуру, как вы указали:

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. С первым методом вставки таблицы вы можете сделать что-то с каждой строкой по отдельности или даже присоединиться к таблице. Было бы лучше, если бы вообще было возможно присоединиться к таблице, но если вам нужно что-то сделать с каждой строкой по отдельности, курсор быстрого просмотра только для чтения на самом деле быстрее, чем зацикливание себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...