Я давно изучаю функции и хранимые процедуры, но не знаю, почему и когда мне следует использовать функцию или хранимую процедуру. Они выглядят одинаково для меня, может быть, потому что я новичок в этом.
Может кто-нибудь сказать мне, почему?
Я давно изучаю функции и хранимые процедуры, но не знаю, почему и когда мне следует использовать функцию или хранимую процедуру. Они выглядят одинаково для меня, может быть, потому что я новичок в этом.
Может кто-нибудь сказать мне, почему?
Ответы:
Функции являются вычисляемыми значениями и не могут выполнять постоянные изменения среды
SQL Server
(т. Е. Не допускаютсяINSERT
илиUPDATE
операторы).Функцию можно использовать встроенным в
SQL
операторах, если она возвращает скалярное значение, или к ней можно присоединиться, если она возвращает набор результатов.Этот момент стоит отметить из комментариев, в которых обобщается ответ. Благодаря @Sean K Андерсон:
Как вызвать
SQL
функцию из хранимой процедуры и когда мы используем функцию вместо хранимой процедуры.Привет друзья, сегодня мы обсудим, когда использовать хранимую процедуру и когда использовать функцию. В простой команде Если вы хотите вычислить некоторые значения, и они вернут одно значение, так что это не обязательно:
https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html
источник
Разница между SP и UDF указана ниже:
источник
Функции и хранимые процедуры служат отдельным целям. Хотя это не лучшая аналогия, функции можно рассматривать буквально как любую другую функцию, которую вы используете на любом языке программирования, но хранимые процедуры больше похожи на отдельные программы или пакетный скрипт.
Функции обычно имеют выход и опционально входы. Затем выходные данные можно использовать в качестве входных данных для другой функции (встроенной в SQL Server, такой как DATEDIFF, LEN и т. Д.) Или в качестве предиката для SQL-запроса - например,
SELECT a, b, dbo.MyFunction(c) FROM table
илиSELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)
.Хранимые процедуры используются для связывания запросов SQL вместе в транзакции и взаимодействия с внешним миром. Фреймворки, такие как ADO.NET и т. Д., Не могут напрямую вызывать функцию, но могут напрямую вызывать хранимый процесс.
Тем не менее, функции имеют скрытую опасность: они могут использоваться неправильно и вызывать довольно неприятные проблемы с производительностью: рассмотрим этот запрос:
Где MyFunction объявлен как:
Здесь происходит то, что функция MyFunction вызывается для каждой строки в таблице MyTable. Если MyTable имеет 1000 строк, то это еще 1000 специальных запросов к базе данных. Точно так же, если функция вызывается при указании в спецификации столбца, то функция будет вызываться для каждой строки, возвращаемой SELECT.
Таким образом, вы должны быть осторожны при написании функций. Если вы выполняете SELECT из таблицы в функции, вам нужно спросить себя, может ли она быть лучше выполнена с помощью JOIN в родительском хранимом протоколе или какой-либо другой конструкции SQL (такой как CASE ... WHEN ... ELSE ... КОНЕЦ).
источник
SELECT * from dbo.MyTableValuedFunction()
. Sprocs, с другой стороны, может быть вызван напрямую из ADO.NET, установивSqlCommand.CommandType
вCommandType.StoredProcedure
.Различия между хранимыми процедурами и пользовательскими функциями:
RAISEERROR
ИЛИ@@ERROR
не допускаются в UDF.GETDATE()
нельзя использовать в UDF.источник
GETDATE()
может быть использован в функции. Поворот на недетерминированном не является хорошим.Напишите пользовательскую функцию, когда вы хотите вычислить и вернуть значение для использования в других инструкциях SQL; написать хранимую процедуру, когда вы хотите вместо этого сгруппировать возможно сложный набор операторов SQL. В конце концов, это два совершенно разных варианта использования!
источник
источник
Основная разница
Функция должна возвращать значение, но в хранимой процедуре это необязательно (процедура может возвращать ноль или n значений).
Функции могут иметь только входные параметры для него, тогда как процедуры могут иметь параметры ввода / вывода.
Функция принимает один входной параметр, это обязательно, но хранимая процедура может принимать o или n входных параметров.
Функции могут быть вызваны из процедуры, тогда как процедуры не могут быть вызваны из функции.
Прогресс Разница
Процедура допускает в нем SELECT, а также оператор DML (INSERT / UPDATE / DELETE), тогда как функция допускает только оператор SELECT.
Процедуры не могут быть использованы в операторе SELECT, тогда как функция может быть встроена в оператор SELECT.
Хранимые процедуры не могут использоваться в инструкциях SQL где-либо в разделе WHERE / HAVING / SELECT, тогда как функция может быть.
Функции, которые возвращают таблицы, могут рассматриваться как другой набор строк. Это может быть использовано в соединениях с другими таблицами.
Встроенная функция может быть представлением, которое принимает параметры и может использоваться в соединениях и других операциях набора строк.
Исключение может быть обработано блоком try-catch в процедуре, тогда как блок try-catch нельзя использовать в функции.
Мы можем перейти к управлению транзакциями в процедуре, тогда как мы не можем перейти к функции.
источник
источник
Returns
ключевого слова и должно быть скалярным или табличным типом). , но хранимые процедуры могут опционально возвращать: a)Int
код результата 1 типа с помощью оператораReturn
и / или b) параметры 1+ (включаяCursor
тип) с помощьюOutput
ключевого слова и / или c) наборы строк 1+ с помощьюSelect
операторов. Если только 1 набор строк возвращается, его можно использовать в качестве аргумента «execute_statement» оператора «Insert Into».Пользовательская функция является важным инструментом, доступным программисту сервера SQL. Вы можете использовать его встроенным в SQL-выражении, например, так
где
lookupValue
будет UDF. Этот вид функциональности невозможен при использовании хранимой процедуры. В то же время вы не можете делать определенные вещи внутри UDF. Основное, что нужно запомнить, это то, что UDF:хранимая процедура может делать эти вещи.
Для меня встроенное использование UDF является наиболее важным использованием UDF.
источник
Хранимые процедуры используются в качестве сценариев . Они запускают ряд команд для вас, и вы можете запланировать их запуск в определенное время. Обычно запускает несколько операторов DML, таких как INSERT, UPDATE, DELETE и т. Д. Или даже SELECT.
Функции используются в качестве методов. Вы передаете это что-то, и оно возвращает результат. Должен быть маленьким и быстрым - делает это на лету. Обычно используется в операторе SELECT.
источник
Хранимая процедура:
EXEC
илиEXECUTE
оператора.OUT
параметр.Функция:
Может использоваться только для выбора записей. Однако его можно легко вызвать из стандартного SQL, например:
или
Для простых многократных операций выбора функции могут упростить код. Просто будьте осторожны с использованием
JOIN
предложений в ваших функциях. Если в вашей функции естьJOIN
предложение, и вы вызываете его из другого оператора select, который возвращает несколько результатов, этот вызов функцииJOIN
объединит эти таблицы для каждой строки, возвращенной в наборе результатов. Поэтому, хотя они могут быть полезны для упрощения некоторой логики, они также могут быть узким местом в производительности, если они не используются должным образом.OUT
параметра.источник
Пользовательская функция.
Хранимая процедура
источник
Чтобы решить, когда использовать то, что могут помочь следующие пункты:
Хранимые процедуры не могут возвращать табличную переменную, где функция может это сделать.
Вы можете использовать хранимые процедуры для изменения параметров среды сервера, если вы не можете использовать функции.
ура
источник
Функции SQL Server, такие как курсоры, предназначены для использования в качестве вашего последнего оружия! У них действительно есть проблемы с производительностью, и поэтому следует избегать использования табличных функций. Говоря о производительности, мы говорим о таблице с более чем 1 000 000 записей, размещенных на сервере на оборудовании среднего класса; в противном случае вам не нужно беспокоиться о падении производительности, вызванном функциями.
для дальнейшей ссылки см .: http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html
источник
Начните с функций, которые возвращают одно значение. Приятно то, что вы можете поместить часто используемый код в функцию и вернуть их в виде столбца в наборе результатов.
Затем вы можете использовать функцию для параметризованного списка городов. dbo.GetCitiesIn ("NY") Возвращает таблицу, которую можно использовать как объединение.
Это способ организации кода. Знание того, когда что-то можно использовать повторно, а когда это пустая трата времени, приобретается только путем проб, ошибок и опыта.
Кроме того, функции являются хорошей идеей в SQL Server. Они быстрее и могут быть довольно мощными. Встроенный и прямой выбор. Осторожно, чтобы не злоупотреблять.
источник
Вот практическая причина предпочесть функции хранимым процедурам. Если у вас есть хранимая процедура, которой нужны результаты другой хранимой процедуры, вы должны использовать оператор insert-exec. Это означает, что вам нужно создать временную таблицу и использовать
exec
инструкцию для вставки результатов хранимой процедуры в временную таблицу. Это грязно. Одна проблема с этим состоит в том, что вставка-execs не может быть вложенной .Если вы застряли с хранимыми процедурами, которые вызывают другие хранимые процедуры, вы можете столкнуться с этим. Если вложенная хранимая процедура просто возвращает набор данных, ее можно заменить табличной функцией, и вы больше не получите эту ошибку.
( это еще одна причина, по которой мы должны хранить бизнес-логику вне базы данных )
источник
источник
Функции могут использоваться в операторе выбора, тогда как процедуры не могут.
Хранимая процедура принимает как входные, так и выходные параметры, но функции принимают только входные параметры.
Функции не могут возвращать значения типа text, ntext, image & timestamps там, где это могут сделать процедуры.
Функции могут использоваться в качестве пользовательских типов данных в создаваемой таблице, но процедуры не могут.
*** Например: -create
table <tablename>(name varchar(10),salary getsal(name))
Здесь getsal - это пользовательская функция, которая возвращает тип заработной платы, когда при создании таблицы не выделяется память для типа зарплаты, и функция getsal также не выполняется, но когда мы выбираем некоторые значения из этой таблицы, функция getal get выполняется и Возвращаемый тип возвращается как набор результатов.
источник
Я понимаю, что это очень старый вопрос, но я не вижу ни одного важного аспекта, упомянутого ни в одном из ответов: включение в план запроса.
Функции могут быть ...
Скалярное:
CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END
Таблица с несколькими утверждениями
CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END
Встроенное табличное значение:
CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...
Третий вид (встроенное табличное значение) обрабатывается оптимизатором запросов по существу как (параметризованные) представления, что означает, что ссылка на функцию из вашего запроса аналогична вставке копии тела SQL функции (без фактического вставки копирования), что приводит к к следующим преимуществам:
Вышеуказанное может привести к потенциально значительной экономии производительности, особенно при объединении нескольких уровней функций.
ПРИМЕЧАНИЕ. Похоже, что в SQL Server 2019 также будет введена некоторая форма скалярного встраивания .
источник
В SQL Server функции и хранимые процедуры представляют собой два разных типа объектов.
Функция: В базе данных SQL Server функции используются для выполнения некоторых действий, и действие немедленно возвращает результат. Функции бывают двух типов:
Система определена
Определяемые пользователем
Хранимые процедуры. В SQL Server хранимые процедуры хранятся на сервере и могут возвращать ноль, одно и несколько значений. Хранимые процедуры бывают двух типов:
источник