вызвать хранимую процедуру для каждой записи - PullRequest
0 голосов
/ 16 августа 2010

У меня есть хранимая процедура SQL, которая передает и возвращает некоторые значения:

CREATE PROCEDURE [dbo].[GetMoney]
   @userId int,  
   @month DateTime
AS
BEGIN
  ....
  Select @something
END

Я хочу вызвать процедуру GetMoney для каждого пользователя в таблице пользователей и использовать результаты в запросе SQL.Как я могу это сделать?

Ответы [ 4 ]

6 голосов
/ 16 августа 2010

Целью СУБД является то, что они работают в наборах.Вместо того, чтобы обрабатывать всех пользователей за один раз, все будет быстрее

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

2 голосов
/ 16 августа 2010

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

CREATE FUNCTION [dbo].[GetMoney]
  @userId int,  
  @month DateTime
  RETURNS 
AS
BEGIN
  ....
  SELECT @result = @something

  RETURN @result
END

Тогда вы будете использовать его следующим образом:

SELECT dbo.GetMoney(t.userid, t.month)

Но я хочу подчеркнуть, что вы думаете о подходе процедурного / OO-программирования в мире на основе SET, ине рекомендую заниматься этим.Он не будет работать хорошо, поэтому он не будет масштабироваться при увеличении нагрузки.

0 голосов
/ 17 августа 2010

ИЛИ, в качестве альтернативы, вы можете определить свой сохраненный процесс, чтобы принимать переменную таблицы в качестве входных данных.После этого вы можете вызвать proc один раз, отправив всех ваших пользователей, и он обработает все отправленные вами записи на основе набора.Нет необходимости в курсоре, нет необходимости в отдельном процессе для одной записи или нескольких записей.Это, конечно, будет работать только в SQl Server 2008.

0 голосов
/ 16 августа 2010

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

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