Хранимая процедура с выходными параметрами или табличной функцией? - PullRequest
3 голосов
/ 28 марта 2010

Какой подход лучше использовать, если мне нужен член (sp или func), возвращающий 2 параметра:

CREATE PROCEDURE Test
   @in INT,
   @outID INT OUT,
   @amount DECIMAL OUT
AS
BEGIN
   ...
END

или

CREATE FUNCTION Test
(
   @in INT
)
RETURNS @ret TABLE (outID INT, amount DECIMAL)
AS
BEGIN
   ...
END

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

EXEC Foobar @outID, @outAmount

Ответы [ 7 ]

3 голосов
/ 28 марта 2010

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

С другой стороны, он может возвращать набор, который может быть немедленно объединен с другим набором записей в том же запросе.

Если вы используете DML или вам не нужно использовать выходные параметры в выражениях на основе набора, используйте сохраненный процесс; в противном случае создайте TVF.

1 голос
/ 28 марта 2010

Выходные параметры.

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

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

1 голос
/ 28 марта 2010

Я бы использовал табличную -значную функцию, если бы мне нужно было получить таблицу значений.

Если в ваших выходных данных есть только одна «строка», то было бы предпочтительнее использовать выходные параметры в хранимой процедуре.

Единственным исключением является то, что ваш SP / UDF может быть записан как один оператор SELECT - т.е. Встроенная функция - потому что SQL Server может оптимизировать работу, если вам когда-нибудь понадобится присоедините его к выводу другого запроса. Возможно, вы этого не делаете сейчас, но написание встроенного UDF означает, что вы не будете застигнуты врасплох медленными запросами патронов и отчетами о превышении времени ожидания, если кто-то начнет использовать его таким образом в будущем.

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

1 голос
/ 28 марта 2010

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

1 голос
/ 28 марта 2010

С помощью хранимой процедуры с использованием выходных параметров вы сможете вернуть только два значения: @outID и @amount.

С помощью табличной функции вы сможете вернуть целый набор (outID, amount) кортежей . Кроме того, табличную функцию можно использовать везде, где в запросах допускаются выражения таблиц или представлений, например:

SELECT dbo.Test(1) AS TestValues
1 голос
/ 28 марта 2010

Хранимая процедура, которая вызывает функцию :-) Я думаю, что любая из них подойдет вам ... если ваше приложение использует хранимые процедуры для запросов к базе данных, то может быть лучше быть последовательным ... если вы используете ORM, он может не распознавать функцию ... Я не думаю, что вы можете ошибиться с любой.

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

НТН.

0 голосов
/ 28 марта 2010

Я думаю, что вашей лучшей ставкой была бы SP, потому что с TBF (функцией табличного значения) вам пришлось бы перебирать таблицу, чтобы получить свое значение.

Имейте в виду, что если вы перебираете таблицу в SQL, вам нужно будет использовать CURSOR (что не так уж и плохо, но может быть немного сложно).

...