В чем разница между «функцией» и «процедурой»?


203

Вообще говоря, мы все слышим о функциях или процедурах в языках программирования. Однако я только что узнал, что я использую эти термины почти взаимозаменяемо (что, вероятно, очень неправильно).

Итак, мой вопрос:

В чем разница с точки зрения их функциональности, их назначения и использования?

Пример будет оценен.


Смотрите также: stackoverflow.com/q/10388393/974555
gerrit

6
Я думаю, что SICP понимает это правильно. Функции существуют только в математике, и они представляют то, что является знанием. Процедуры существуют на языках программирования (включая функциональные), и они представляют, как к знаниям. Функция : sqrt (x) = y такая, что y ^ 2 = x. Процедура : (define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0)).
mk12

Ответы:


296

Функция возвращает значение, а процедура просто выполняет команды.

Название функции происходит от математики. Он используется для расчета значения на основе ввода.

Процедура - это набор команд, которые могут быть выполнены по порядку.

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

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


Как вы можете гарантировать отсутствие побочных эффектов ни в императиве (java, c), ни в декларативном языке (scala, схема)?
orlybg

1
@orlybg, в декларативных языках согласованность происходит от реализации языка. Их ограничения по объему предотвращают побочные эффекты. С другой стороны, императивные языки явно используют свои побочные эффекты. Побочные эффекты не всегда плохие.
Таринду Русира

Я читаю следующий учебник Ada ( goanna.cs.rmit.edu.au/~dale/ada/aln/8_subprograms.html ), где второй абзац этой страницы начинается с «Процедуры в Аде похожи на те, в Паскале . Процедура может содержать операторы возврата. Это ошибка в тексте? Или это означает, что он может иметь операторы return, но не возвращает никаких значений?
Jviotti

3
В паскале процедуры не имеют операторов возврата, есть только функции. Должна быть ошибка в тексте. Однако процедура может иметь оператор «exit», который может выступать в качестве оператора «return» без аргументов, что означает отсутствие возвращаемых значений.
Эрик Фортье

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

42

Это зависит от контекста.

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

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

В функциональных языках обычно нет такой вещи как процедура - все является функцией.


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

18

Пример в C:

// function
int square( int n ) {
   return n * n;
}

// procedure
void display( int n ) {
   printf( "The value is %d", n );
}

Хотя вы должны заметить, что в стандарте C говорится не о процедурах, а о функциях


4
... Стандарт C не говорит о процедурах, только о функциях. Это потому, что у него есть только функции. Функция, которая ничего не возвращает - это void function. Kernighan & Ritchie Ch 1.7: «В Си функция эквивалентна подпрограмме или функции в Фортране, или процедуре или функции в Паскале». Другими словами ... этот ответ неверен.
Могсдад

8
Ответ не является неправильным, и это хороший пример различия между чистыми функциями и процедурами. K & R назвала каждую подпрограмму «функцией», чтобы все было просто, но подпрограмма с побочными эффектами - это фактически «процедура», а не «функция» в каноническом смысле математики. Язык C мог бы быть лучше, если бы он отличал реальные функции от процедур, это помогло бы в статическом анализе, оптимизации производительности и распараллеливании.
Сэм Уоткинс,

12

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


11

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

Функции и процедуры являются реализациями тех. Обычно функции возвращают значения, а процедуры ничего не возвращают.


6

Основные отличия

  • Функция должна возвращать значение, но в хранимых процедурах это необязательно: процедура может возвращать 0 или n значений.
  • Функции могут иметь только входные параметры для него, тогда как процедуры могут иметь параметры ввода / вывода.
  • Для функции обязательно принимать один входной параметр, но хранимая процедура может принимать от 0 до n входных параметров.
  • Функции могут быть вызваны из процедуры, тогда как процедуры не могут быть вызваны из функции.

Расширенные различия

  • Исключения могут обрабатываться блоками try-catch в процедуре, тогда как блок try-catch не может использоваться в функции.
  • Мы можем перейти к управлению транзакциями в процедуре, тогда как в функции мы не можем.

В SQL:

  • Это процедура позволяет SELECTкак DML ( INSERT, UPDATE, DELETE) отчетности в нем, в то время как функция позволяет только SELECTзаявление в нем.
  • Процедуры нельзя использовать в SELECTоператоре, тогда как функции могут быть встроены в SELECTинструкцию.
  • Хранимые процедуры не могут использоваться в инструкциях SQL где- либо в блоке WHERE(или a HAVINGили a SELECT), тогда как функции могут.
  • Функции, которые возвращают таблицы, могут рассматриваться как другой набор строк. Это может быть использовано вJOIN блоке с другими таблицами.
  • Встроенные функции могут рассматриваться как представления, которые принимают параметры и могут использоваться в JOINблоках и других операциях Rowset.

3
Этот ответ очень специфичен для конкретного языка, в то время как вопрос не зависел от языка. Приведенные здесь утверждения не все верны в общем случае, но было бы полезно, если бы вы разъяснили язык или среду, в которой вы их утверждаете.
Могсдад

5

Более строго, функция f подчиняется свойству f (x) = f (y), если x = y, то есть она вычисляет один и тот же результат каждый раз, когда ее вызывают с одним и тем же аргументом (и, таким образом, она не меняет состояние система) .

Таким образом, rand () или print («Hello») и т. Д. Являются не функциями, а процедурами. В то время как sqrt (2.0) должен быть функцией: не наблюдается наблюдаемого эффекта или изменения состояния, независимо от того, как часто он вызывается, и он всегда возвращает 1.41 и некоторые.


3
Такое использование актуально в контексте «функционального» программирования. Имейте в виду, что многие (часто обязательные) языки, которые называют свои подпрограммы «функциями», не требуют этого свойства.
dmckee --- котенок экс-модератора

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

4

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

Функции, с другой стороны, являются несколько независимым фрагментом кода в более крупной программе. Другими словами, функция - это реализация процедуры.


4

Это хорошо известный старый вопрос, но я хотел бы поделиться некоторыми соображениями о современных исследованиях и дизайне языков программирования.

Основной ответ

Традиционно (в смысле структурированного программирования ) и неформально, процедура - это многократно используемая структурная конструкция , имеющая «вход» и выполняющая что-то программируемое. Когда что-то необходимо сделать внутри процедуры, вы можете предоставить (фактические) аргументы этой процедуры в вызове процедуры, закодированном в исходном коде (обычно в виде выражения), а действия, закодированные в теле процедуры (при условии в определении процедуры) будет выполняться с подстановкой аргументов в (формальные) параметры, используемые в теле.

Функция больше , чем процедуры , поскольку возвращаемые значения также могут быть заданы как «выход» в организме. Вызовы функций более или менее идентичны вызовам процедур, за исключением того, что вы можете также использовать результат вызова функции синтаксически (обычно как подвыражение какого-либо другого выражения).

Традиционно вызовы процедур (а не вызовы функций) используются для указания того, что ни один вывод не должен интересовать, и должны быть побочные эффекты, чтобы избежать того, чтобы вызов был неиспользуемым, что подчеркивает парадигму императивного программирования . Многие традиционные языки программирования, такие как Pascal, предоставляют как «процедуры», так и «функции», чтобы различать это намеренное различие стилей.

(Для ясности, «вход» и «выход», упомянутые выше, являются упрощенными понятиями, основанными на синтаксических свойствах функций. Многие языки дополнительно поддерживают передачу аргументов в параметры посредством ссылки / совместного использования, чтобы позволить пользователям переносить информацию, закодированную в аргументах во время вызовов Такой параметр может даже называться просто «параметром in / out». Эта функция основана на природе объектов, передаваемых в вызовах, которая ортогональна свойствам функции процедуры / функции.)

Однако, если результат вызова функции не нужен, его можно просто (по крайней мере, логически) игнорировать, и определения функций / вызовы функций должны быть совместимы с определениями процедур / вызовами процедур таким образом. Подобные ALGOL языки, как C, C ++ и Java, все предоставляют функцию «функции» таким образом: кодируя тип результата voidкак особый случай функций, похожих на традиционные процедуры, нет необходимости предоставлять функцию «процедур» " по отдельности. Это предотвращает некоторое раздувание в дизайне языка.

Поскольку упоминается SICP, также стоит отметить, что на языке Схемы, указанном в R n RS , процедура может или не может возвращать результат вычисления. Это объединение традиционных «функций» (возвращающих результат) и «процедур» (не возвращающих ничего), по сути, совпадающих с концепцией «функций» многих ALGOL-подобных языков (и фактически разделяющих еще больше гарантий, таких как аппликативные оценки операнды перед вызовом). Тем не менее, старомодные различия встречаются даже в нормативных документах, таких как SRFI-96 .

Я не знаю много о точных причинах расхождения, но, как я понял, кажется, что языковые дизайнеры будут счастливее без раздувания спецификаций в наши дни. То есть «процедура» как отдельная функция не нужна. Техники, подобные voidтипу, уже достаточны, чтобы обозначить использование, где следует подчеркнуть побочные эффекты. Это также более естественно для пользователей, имеющих опыт работы с C-подобными языками, которые популярны более нескольких десятилетий. Более того, это позволяет избежать затруднений в таких случаях, как R n RS, где «процедуры» фактически являются «функциями» в более широком смысле.

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

  • Как и в R n RS, просто помечать незаинтересованные результаты как «неопределенное» значение (неопределенного типа, если язык должен упомянуть об этом), и этого достаточно, чтобы его игнорировать.
  • Указание незаинтересованных результата как значение выделенного типа устройства (например , Kernel «s #inert) также работает.
  • Если этот тип является еще одним нижним типом , его можно (надеюсь) статически проверить и предотвратить в качестве типа выражения. voidТипа в Алгол-подобных языках именно пример этой техники. ISO C11 _Noreturnявляется аналогичным, но более тонким в этом роде.

дальнейшее чтение

В соответствии с традиционной концепцией, основанной на математике, существует масса чёрной магии, о которой большинство людей не знают. Строго говоря, вы вряд ли получите ясное представление о ваших книгах по математике. Книги по CS тоже могут не сильно помочь.

Что касается языков программирования, есть несколько предостережений:

  • Функции в разных разделах математики не всегда определяются в одном и том же значении. Функции в разных парадигмах программирования также могут сильно различаться (даже иногда синтаксис вызова функции выглядит одинаково). Иногда причины, вызывающие различия, одинаковы, но иногда это не так.
    • Это идиоматическое модели вычислений с помощью математических функций , а затем реализовать в основной расчет на языках программирования. Будьте осторожны, чтобы не отображать их один на один, если вы не знаете, о чем идет речь.
  • Не путайте модель с сущностью, которую нужно смоделировать.
    • Последнее является лишь одним из вариантов реализации первого. В зависимости от контекста может быть более одного выбора (например, интересующие ветви математики).
    • В частности, более или менее аналогично абсурдно рассматривать «функции» как «отображения» или подмножества декартовых произведений, например, рассматривать натуральные числа как кодирование фононеймановских ординалов (выглядящих как куча {{{}}, {}}...), помимо некоторых ограниченных контекстов ,
  • Математически, функции могут быть частичными или полными . У разных языков программирования здесь разное отношение.
    • Некоторые функциональные языки могут соблюдать совокупность функций, чтобы гарантировать, что вычисления в вызовах функций всегда завершаются за конечные шаги. Тем не менее, это, по сути, не является полной по Тьюрингу, следовательно, более слабой вычислительной выразительностью, и мало встречается в языках общего назначения, кроме семантики проверки типов (которая, как ожидается, будет полной).
    • Если разница между процедурами и функциями значительна, должны ли быть «общие процедуры»? Хм ...
  • Конструкции, аналогичные функциям в исчислениях, используемых для моделирования общих вычислений и семантики языков программирования (например, лямбда-абстракций в лямбда-исчислениях ), могут иметь различные стратегии оценки операндов.
    • В традиционных сокращениях в чистых исчислениях, а также в оценках выражений в чисто функциональных языках нет побочных эффектов, влияющих на результаты вычислений. В результате, операнды не должны оцениваться перед телом функционально-подобных конструкций (поскольку инвариант для определения «тех же результатов» сохраняется в свойствах, подобных β- эквивалентности, гарантированной свойством Черча-Россера ).
    • Однако многие языки программирования могут иметь побочные эффекты во время оценки выражений. Это означает, что стратегии строгой оценки, такие как аппликативная оценка , не похожи на стратегии строгой оценки, такие как вызов по требованию . Это важно, потому что без различия нет необходимости различать функциональные (то есть используемые с аргументами) макросы от (традиционных) функций. Но в зависимости от аромата теорий, это все еще может быть артефактом. При этом в более широком смысле функционально-подобные макросы (особенно гигиенические ) представляют собой математические функции с некоторыми ненужными ограничениями (синтаксические фазы). Без ограничений было бы разумно рассматривать функциональные макросы (первоклассные) как процедуры ...
    • Для читателей, интересующихся этой темой, рассмотрим некоторые современные абстракции .
  • Процедуры обычно считаются выходящими за рамки традиционной математики. Тем не менее, в исчислении, моделирующем семантику языка вычислений и программирования, а также в современных разработках языков программирования, может существовать довольно большое семейство связанных понятий, разделяющих «вызываемую» природу. Некоторые из них используются для реализации / расширения / замены процедур / функций. Есть еще более тонкие различия.

3

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

В контексте функционального программирования (где все функции возвращают значения), функция является абстрактным объектом:

f(x)=(1+x)
g(x)=.5*(2+x/2)

Здесь f - это та же функция, что и g, но это другая процедура.


3

Внутри процедуры мы можем использовать операторы DML (Insert / Update / Delete), но внутри функции мы не можем использовать операторы DML.

Процедура может иметь оба параметра ввода \ вывода, но функция может иметь только входной параметр.

Мы можем использовать блок Try-Catch в хранимой процедуре, но в функции Мы не можем использовать блок Try-Catch.

Мы не можем использовать хранимую процедуру в операторе Select, но в функции мы можем использовать в операторе Select.

Хранимая процедура может возвращать 0 или n значений (максимум 1024), но функция может возвращать только 1 значение, которое является обязательным.

Хранимая процедура не может быть вызвана из функции, но мы можем вызвать функцию из хранимой процедуры.

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

Мы не можем использовать хранимую процедуру в выражении Sql где-либо в разделе Где / Имеем / выберите, но в функции, которую мы можем использовать.

Мы не можем присоединиться к хранимой процедуре, но мы можем присоединиться к функции.

для получения дополнительной информации нажмите здесь ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html


2
Этот ответ очень специфичен для конкретного языка, в то время как вопрос не зависел от языка. Приведенные здесь утверждения не все верны в общем случае, но было бы полезно, если бы вы разъяснили язык или среду, в которой вы их утверждаете.
Могсдад

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

2

Функция возвращает значение, а процедура просто выполняет команды.

Название функции происходит от математики. Он используется для расчета значения на основе ввода.

Процедура - это набор команд, которые могут быть выполнены по порядку.

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

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


1

Функцию можно использовать внутри оператора SQL, тогда как процедуру нельзя использовать в операторе SQL.

Операторы Insert, Update и Create не могут быть включены в функцию, но процедура может иметь эти операторы.

Процедура поддерживает транзакции, но функции не поддерживают транзакции.

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

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


1

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

Функция - это не просто старый метод, который возвращает значение. Не так: чтобы метод был реальной функцией, он должен возвращать одно и то же значение, всегда учитывая конкретный вход. Примером метода, который не является функцией, являетсяrandom метод в большинстве языков, потому что, хотя он и возвращает значение, значение не всегда одинаково.

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

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

// The following is pseudo code:
g(x) = {
  if (morning()) {
     g = 2 * x;
  }
  else {
   g = x;
  }
  return g;
}

Я также возражаю против того, что процедуры не возвращают значений. Процедура - это просто особый способ говорить о функции или методе. Таким образом, это означает, что если базовый метод, который ваша процедура определяет или реализует, возвращает значение, то угадайте, что эта процедура возвращает значение. Возьмите, например, следующий фрагмент из SICP :

// We can immediately translate this definition into a recursive procedure 
// for computing Fibonacci numbers:

(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))

Вы много слышали о рекурсивных процедурах в последнее время? Они говорят о рекурсивной функции (реальной функции), и она возвращает значение, и они используют слово «процедура». Так в чем же разница?

Ну и еще один способ мышления функции (помимо значения, упомянутого выше) - это абстрактное представление идеала, подобного цифре 1. Процедура - это фактическая реализация этой вещи. Я лично думаю, что они взаимозаменяемы.

(Обратите внимание, что если вы прочитаете эту главу по ссылке, которую я предоставляю, вы можете обнаружить, что более сложная концепция - это не разница между функцией и процедурой, а процесс и процедура. Знаете ли вы, что рекурсивная процедура может иметь итерационный процесс?)

Аналогом для процедур являются рецепты. Например; Предположим, у вас есть машина, которая называется make-piesэта машина принимает ингредиенты, (fruit, milk, flower, eggs, sugar, heat)и эта машина возвращает а pie.

Представление этой машины может выглядеть так

make-pies (fruit, milk, flower, eggs, sugar, heat) = {
   return (heat (add fruit (mix eggs flower milk)))
}

Конечно, это не единственный способ сделать пирог.

В этом случае мы можем видеть, что:

A       function     is to a     machine
as a    procedure    is to a     recipe
as      attributes   are to      ingredients
as      output       is to       product

Эта аналогия в порядке, но она нарушается, если учесть, что когда вы имеете дело с компьютерной программой, все является абстракцией. Таким образом, в отличие от рецепта машины, мы сравниваем две вещи, которые сами являются абстракцией; две вещи, которые могут быть одинаковыми. И я считаю, что они (для всех намерений и целей) одно и то же.


2
Функция, которая всегда возвращает одно и то же значение для заданных аргументов, иногда называется «чистой функцией». В большинстве языков, которые различают процедуры и функции, функции не обязательно должны быть чистыми, и термин «функция» правильно используется для обозначения подпрограмм, которые могут иметь побочные эффекты и которые могут возвращать разные результаты при последовательных вызовах с одинаковыми аргументами. (А в C-подобных языках даже подпрограммы, которые не возвращают значения, должным образом называются «функциями».)
Кит Томпсон

Договорились, вот почему я заканчиваю, говоря слова взаимозаменяемы.
dkinzer

1
Да, но вы начинаете с того, что говорите, что «функция - это не просто какой-то старый метод, который возвращает значение», тогда как во многих языках это именно то , чем является функция.
Кит Томпсон

0

В контексте db : Хранимая процедура - это предварительно скомпилированный план выполнения, в котором функции отсутствуют.


0

В терминах С # / Java функция - это блок кода, который возвращает определенное значение, а процедура - это блок кода, который возвращает void (ничего). В C # / Java и функции, и процедуры чаще называют просто методами .

    //This is a function
    public DateTime GetCurrentDate()
    {
        return DateTime.Now.Date;
    }

    //This is a procedure(always return void)
    public void LogMessage()
    {
        Console.WriteLine("Just an example message.");
    }

-3

Процедуры: 1.Процедуры - это наборы операторов, которые определяют параметризованные вычисления. 2.Процедуры не могут возвращать значения.

3.Процедуры не могут быть вызваны из функции.

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


3.Процедуры не могут быть вызваны из функции. На каком языке это правда? Ни у кого из меня нет такого ограничения.
Могсдад

Это правда. Если вы вызываете процедуру из функции, то это не функция. Относительно того, какой язык обеспечивает это, это хороший вопрос, на который я не знаю ответа. Может быть и функциональным, но даже тогда я не уверен: чистый список функционален (нет множества: нет побочных эффектов), но так как в нем есть лямбды, можно реализовать множество. Не могли бы вы написать компилятор, который не использует set, он должен был бы обнаружить все его реализации. Вы можете удалить лямбды из языка, но это будет хуже.
ctrl-alt-delor

Ооо, я только что подумал о языке C ++: метод const не может вызывать неконстантный метод (хотя вам понадобится включить правильные проверки компилятора, а не пытаться его обойти.)
ctrl-alt-delor

-7

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


Нет Процедура ничего не делает return. Вы говорите о побочных эффектах, которые возможны с обоими (если это разрешено языком).
Могсдад

Процедура может вернуть любое количество значений, эта сумма может быть нулевой
user2766296

Побочным эффектом было бы, если бы a имел массив и передавал его в функцию или процедуру, которая нашла наибольшее значение, массив передавался бы по ссылке, а после запуска подпрограммы массив сортировался, тот факт, что он отсортированный является побочным эффектом, возвращаемое значение является наибольшим значением в массиве
user2766296

Мне нравится этот ответ, а также те, у кого несколько отрицательных голосов, потому что в некотором роде они довольно правильные, поэтому, как это ни парадоксально, чтобы сделать его очень популярным в SO, я дам ему отрицательное голосование. Хранимая процедура в SQL Server возвращает набор результатов (так называемые «множественные значения»), тогда как функция может возвращать только одно значение (что не очень точно, так как вы также можете создать табличную функцию).
Иванзиньо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.