Я давно изучаю функции и хранимые процедуры, но не знаю, почему и когда мне следует использовать функцию или хранимую процедуру. Они выглядят одинаково для меня, может быть, потому что я новичок в этом.
Может кто-нибудь сказать мне, почему?
Я давно изучаю функции и хранимые процедуры, но не знаю, почему и когда мне следует использовать функцию или хранимую процедуру. Они выглядят одинаково для меня, может быть, потому что я новичок в этом.
Может кто-нибудь сказать мне, почему?
Ответы:
Функции являются вычисляемыми значениями и не могут выполнять постоянные изменения среды SQL Server
(т. Е. Не допускаются INSERT
или UPDATE
операторы).
Функцию можно использовать встроенным в SQL
операторах, если она возвращает скалярное значение, или к ней можно присоединиться, если она возвращает набор результатов.
Этот момент стоит отметить из комментариев, в которых обобщается ответ. Благодаря @Sean K Андерсон:
Функции следуют компьютерному определению в том смысле, что они ДОЛЖНЫ возвращать значение и не могут изменять данные, которые они получают в качестве параметров (аргументов). Функции не могут ничего менять, должны иметь хотя бы один параметр и возвращать значение. Хранимые процедуры не должны иметь параметр, могут изменять объекты базы данных и не должны возвращать значение.
Как вызвать SQL
функцию из хранимой процедуры и когда мы используем функцию вместо хранимой процедуры.
Привет друзья, сегодня мы обсудим, когда использовать хранимую процедуру и когда использовать функцию. В простой команде Если вы хотите вычислить некоторые значения, и они вернут одно значение, так что это не обязательно:
https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html
Разница между SP и UDF указана ниже:
+---------------------------------+----------------------------------------+
| Stored Procedure (SP) | Function (UDF - User Defined |
| | Function) |
+---------------------------------+----------------------------------------+
| SP can return zero , single or | Function must return a single value |
| multiple values. | (which may be a scalar or a table). |
+---------------------------------+----------------------------------------+
| We can use transaction in SP. | We can't use transaction in UDF. |
+---------------------------------+----------------------------------------+
| SP can have input/output | Only input parameter. |
| parameter. | |
+---------------------------------+----------------------------------------+
| We can call function from SP. | We can't call SP from function. |
+---------------------------------+----------------------------------------+
| We can't use SP in SELECT/ | We can use UDF in SELECT/ WHERE/ |
| WHERE/ HAVING statement. | HAVING statement. |
+---------------------------------+----------------------------------------+
| We can use exception handling | We can't use Try-Catch block in UDF. |
| using Try-Catch block in SP. | |
+---------------------------------+----------------------------------------+
Функции и хранимые процедуры служат отдельным целям. Хотя это не лучшая аналогия, функции можно рассматривать буквально как любую другую функцию, которую вы используете на любом языке программирования, но хранимые процедуры больше похожи на отдельные программы или пакетный скрипт.
Функции обычно имеют выход и опционально входы. Затем выходные данные можно использовать в качестве входных данных для другой функции (встроенной в 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 и т. Д., Не могут напрямую вызывать функцию, но могут напрямую вызывать хранимый процесс.
Тем не менее, функции имеют скрытую опасность: они могут использоваться неправильно и вызывать довольно неприятные проблемы с производительностью: рассмотрим этот запрос:
SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)
Где MyFunction объявлен как:
CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
DECLARE @retval INTEGER
SELECT localValue
FROM dbo.localToNationalMapTable
WHERE nationalValue = @someValue
RETURN @retval
END
Здесь происходит то, что функция 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. В конце концов, это два совершенно разных варианта использования!
STORE PROCEDURE FUNCTION (USER DEFINED FUNCTION)
* Procedure can return 0, single or | * Function can return only single value
multiple values. |
|
* Procedure can have input, output | * Function can have only input
parameters. | parameters.
|
* Procedure cannot be called from | * Functions can be called from
function. | procedure.
|
* Procedure allows select as well as | * Function allows only select statement
DML statement in it. | in it.
|
* Exception can be handled by | * Try-catch block cannot be used in a
try-catch block in a procedure. | function.
|
* We can go for transaction management| * We can't go for transaction
in procedure. | management in function.
|
* Procedure cannot be utilized in a | * Function can be embedded in a select
select statement | statement.
|
* Procedure can affect the state | * Function can not affect the state
of database means it can perform | of database means it can not
CRUD operation on database. | perform CRUD operation on
| database.
|
* Procedure can use temporary tables. | * Function can not use
| temporary tables.
|
* Procedure can alter the server | * Function can not alter the
environment parameters. | environment parameters.
|
* Procedure can use when we want | * Function can use when we want
instead is to group a possibly- | to compute and return a value
complex set of SQL statements. | for use in other SQL
| statements.
Основная разница
Функция должна возвращать значение, но в хранимой процедуре это необязательно (процедура может возвращать ноль или 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-выражении, например, так
SELECT a, lookupValue(b), c FROM customers
где lookupValue
будет UDF. Этот вид функциональности невозможен при использовании хранимой процедуры. В то же время вы не можете делать определенные вещи внутри UDF. Основное, что нужно запомнить, это то, что UDF:
хранимая процедура может делать эти вещи.
Для меня встроенное использование UDF является наиболее важным использованием UDF.
Хранимые процедуры используются в качестве сценариев . Они запускают ряд команд для вас, и вы можете запланировать их запуск в определенное время. Обычно запускает несколько операторов DML, таких как INSERT, UPDATE, DELETE и т. Д. Или даже SELECT.
Функции используются в качестве методов. Вы передаете это что-то, и оно возвращает результат. Должен быть маленьким и быстрым - делает это на лету. Обычно используется в операторе SELECT.
Хранимая процедура:
EXEC
или EXECUTE
оператора.OUT
параметр.Функция:
Может использоваться только для выбора записей. Однако его можно легко вызвать из стандартного SQL, например:
SELECT dbo.functionname('Parameter1')
или
SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects
Для простых многократных операций выбора функции могут упростить код. Просто будьте осторожны с использованием 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 хранимые процедуры хранятся на сервере и могут возвращать ноль, одно и несколько значений. Хранимые процедуры бывают двух типов: