Вставьте значения хранимой процедуры SQL в другую хранимую процедуру - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть большая хранимая процедура, которая возвращает запись для человека, есть четыре поля, для которых мне нужно вернуть очень конкретные значения. У меня есть другая хранимая процедура, которая выполняет это конкретное действие.

Небольшая хранимая процедура выглядит следующим образом:

SELECT   TOP 1
    wea.field,
    wea.degree,
    wea.degreeyear,
    wpp.ProgramCategory
FROM dbo.webeventaffiliation wea
LEFT JOIN dbo.WebProgramParticipants wpp
    ON 
        wea.userid = wpp.UserID AND
        wea.eventid = wpp.eventid
INNER JOIN dbo.WebProgramCategoryDescriptions wpcd
    ON 
        wpcd.ProgramCategory = wpp.ProgramCategory
WHERE wea.UserID = @UserID
    ORDER BY wea.datelastmodified DESC

ОБРАЗЕЦЫ ВОЗВРАТА ОБРАЗЦОВ БОЛЬШОГО ХРАНЕНИЯ:

Name: XXXXX
Address: XXXXX
Field: [small stored procedure value]
Degree: [small stored procedure value] 
DegreeYear: [small stored procedure value]
ProgramCategory: [small stored procedure value]

У меня вопрос, как мне получить 4 элемента данных из этой хранимой процедуры в соответствующие столбцы в наборе данных, который возвращается из большой хранимой процедуры?

Ответы [ 3 ]

2 голосов
/ 09 декабря 2011

Может быть полезно использование табличной функции вместо хранимой процедуры.Вы сможете использовать TVF как таблицу, например:

SELECT
  COLUMNS_NAMES
FROM
  TVF(PARAMS)
1 голос
/ 09 декабря 2011

Поскольку ваша небольшая хранимая процедура ничего не записывает, вы можете просто написать ее как табличную функцию.

Затем вы можете применить функцию ко всему набору данных с помощью APPLY.

(Табличные функции, которые пишутся как INLINE (не мульти-оператор), затем объясняются как макросы, чтобы выполнить их чрезвычайно эффективно. Это идеально подходит для вашего описания, поскольку функция уже будет просто одним оператором SELECT.)


Функция:

CREATE FUNCTION dbo.your_function(@user_id AS INT)
RETURNS TABLE
AS
RETURN
  <your query>

1012 *
*

Функция, используемая в запросе внутри вашего большого SP:

SELECT
  ...,
  user_detail.field,
  user_detail.degree,
  user_detail.degreeyear,
  user_detail.programcategory
FROM
  ...
CROSS APPLY
  dbo.your_function(some_table.user_id) AS user_detail


Обычно я использую функции для инкапсуляции запросов и заключаю их в хранимые процедуры, только если ...
1) Мне нужно написать данные. (Функции не могут вставлять, обновлять или удалять)
2) Я хочу создать API-интерфейс для клиентских приложений.

0 голосов
/ 09 декабря 2011

Поскольку вы получаете только одну строку с четырьмя значениями, вы можете использовать OUTPUT параметры:

EXECUTE SomeSmallerProcedure
    @field OUTPUT, @degree OUTPUT, @degreeyear OUTPUT, @ProgramCategory OUTPUT;

Ваша процедура, указанная выше, изменится на:

ALTER PROCEDURE SomeSmallerProcedure
  @field varchar(255) OUTPUT,
  @degree varchar(255) OUTPUT,
  @degreeyear varchar(255) OUTPUT,
  @ProgramCategory varchar(255) OUTPUT
AS BEGIN SET NOCOUNT ON;
  SELECT TOP 1
    @field = wea.field,
    @degree = wea.degree,
    @degreeyear = wea.degreeyear,
    @ProgramCategory = wpp.ProgramCategory
  -- ... rest as before

Подписьвашей процедуры выше, должны были бы явно включить эти параметры для OUTPUT.

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