Функция и хранимая процедура в SQL Server
Я изучал функции и хранимую процедуру довольно долго, но я не знаю, почему и когда я должен использовать функцию или хранимую процедуру. Они выглядят одинаково для меня, может быть, потому, что я новичок в этом.
может кто-нибудь сказать мне, почему?
17 ответов
функции являются вычисляемыми значениями и не могут выполнять постоянные изменения среды SQL Server (т. е. инструкции INSERT или UPDATE не разрешены).
функция может использоваться в SQL-операторах, если она возвращает скалярное значение, или может быть объединена, если она возвращает результирующий набор.
момент, который стоит отметить из комментариев, которые суммируют ответ. Спасибо @Sean K Anderson:
функции следовать определением компьютер-науки в том, что они должны возвращать значение и не могут изменять данные, которые они получают в качестве параметров (аргумент.) Функции не могут ничего изменить, должны имейте хотя бы один параметр, и они должны возвращать значение. На хранении procs не должны иметь параметр, могут изменять объекты базы данных, и не нужно возвращать значение.
разница между 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 и т. д. не удается вызвать функцию напрямую, но они могут вызвать сохраненный proc напрямую.
функции имеют скрытую опасность: они могут быть использованы неправильно и вызвать довольно неприятные проблемы с производительностью: рассмотрим этот запрос:
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.
поэтому вам нужно быть осторожными функциями записи. Если вы выбираете из таблицы в функции, вам нужно спросить себя, Может ли это быть лучше выполнено с помощью JOIN in Родительский хранимый proc или какая-либо другая конструкция SQL (например, CASE ... КОГДА... ЕЩЕ... КОНЕЦ.)
напишите определяемую пользователем функцию, когда вы хотите вычислить и вернуть значение для использования в других операторах SQL; напишите хранимую процедуру, когда вы хотите вместо этого, чтобы сгруппировать возможно сложный набор операторов SQL. В конце концов, это два совершенно разных варианта использования!
различия между хранимыми процедурами и пользовательскими функциями:
- хранимые процедуры нельзя использовать в операторах Select.
- хранимые процедуры поддерживают отложенное разрешение имен.
- хранимые процедуры обычно используются для выполнения бизнес-логики.
- хранимые процедуры могут возвращать любой тип данных.
- хранимые процедуры могут принимать большее количество входных параметров, чем задано пользователем функции. На хранении процедуры могут иметь до 21000 входных параметров.
- хранимые процедуры могут выполнять динамический SQL.
- хранимые процедуры поддерживают обработку ошибок.
- в хранимых процедурах могут использоваться недетерминированные функции.
- пользовательские функции могут использоваться в инструкции Select.
- пользовательские функции не поддерживают отложенное разрешение имен.
- пользовательские функции обычно используются для вычисления.
- пользовательские функции должны возвращать значение.
- пользовательские функции не могут возвращать изображения.
- пользовательские функции принимают меньшее число входных параметров, чем хранимые процедуры. UDFs может иметь до 1,023 входных параметров.
- временные таблицы нельзя использовать в пользовательских функциях.
- пользовательские функции не могут выполнять динамический SQL.
- пользовательские функции не поддерживают ошибка обращение.
RAISEERROR
или@@ERROR
не допускаются в UDFs. - недетерминированные функции нельзя использовать в UDFs. Например,
GETDATE()
не может использоваться в UDFs.
Принципиальная Разница
функция должна возвращать значение, но в хранимой процедуре это необязательно (процедура может возвращать нулевые или n значений).
функции могут иметь только входные параметры для него, тогда как процедуры могут иметь входные / выходные параметры .
функция принимает один входной параметр это обязательно, но хранимая процедура может принимать от 0 до n входных параметров..
функции можно вызвать из процедуры, тогда как процедуры не могут быть вызывается из функции.
Заранее Разница
процедура позволяет выбрать, а также оператор DML(INSERT/UPDATE/DELETE) в нем, тогда как функция позволяет только выбрать оператор в нем.
процедуры не могут использоваться в инструкции SELECT, тогда как функция может быть встроена в инструкцию SELECT.
хранимые процедуры не могут использоваться в операторах SQL в любом месте раздела WHERE/HAVING / SELECT, тогда как функция может быть.
функции, возвращающие таблицы, можно рассматривать как другой набор строк. Это можно использовать в соединениях с другими таблицами.
встроенная функция может быть хотя как представления, которые принимают параметры и могут использоваться в соединениях и других операциях набора строк.
исключение может обрабатываться блоком try-catch в процедуре, тогда как блок try-catch не может использоваться в функции.
мы можем пойти на управление транзакциями в процедуре, тогда как мы не можем войти Функция.
пользовательская функция-важный инструмент, доступный программисту sql server. Вы можете использовать его inline в инструкции SQL, например so
SELECT a, lookupValue(b), c FROM customers
здесь lookupValue
будет UDF. Такая функциональность невозможна при использовании хранимой процедуры. В то же время вы не можете делать определенные вещи внутри ОДС. Основное, что нужно помнить здесь, это то, что UDF:
- невозможно создать постоянные изменения
- Не могу изменить данные
хранимая процедура может делать эти вещи.
для меня встроенное использование UDF является самым важным использованием UDF.
Хранимых Процедур используются как скрипты. Они запускают серию команд для вас, и вы можете запланировать их выполнение в определенное время.
функции используются в качестве методов. вы передаете ему что-то, и он возвращает результат. Должен быть маленьким и быстрым-делает это на лету.
хранимая процедура:
- похоже на миниатюрную программу в SQL Server.
- может быть простым, как оператор select, или сложным, как длинный скрипт, который добавляет, удаляет, обновляет и/или считывает данные из нескольких таблицы в базе данных.
- (смогите снабдить петли и курсоры, которые оба позволяют вам работать с меньшие результаты или операции по строкам с данными.)
- следует вызывать с помощью
EXEC
илиEXECUTE
заявление. - возвращает переменные таблицы, но мы не можем использовать
чтобы решить, когда использовать то, что следующие пункты могут помочь -
хранимые процедуры не могут возвращать переменную таблицы, где функция as может это сделать.
вы можете использовать хранимые процедуры для изменения параметров среды сервера, где вы не можете использовать функции.
ура
функции SQL Server, такие как курсоры, предназначены для использования в качестве последнего оружия! У них есть проблемы с производительностью, и поэтому следует избегать использования табличной функции. Говорить о производительности - это говорить о таблице с более чем 1 000 000 записей, размещенных на сервере на оборудовании среднего класса; в противном случае вам не нужно беспокоиться о производительности, вызванной функциями.
- никогда не используйте функцию для возврата результирующего набора в внешний код (например ADO.Net)
- используйте представления / сохраненную комбинацию procs как можно больше. вы можете оправиться от будущих проблем с ростом производительности, используя предложения DTA (советник по настройке базы данных) (например, индексированные представления и статистику) - иногда!
для получения дополнительной информации см.: http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html
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 | 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.
начните с функций, возвращающих одно значение. Хорошо, что вы можете поместить часто используемый код в функцию и вернуть их в виде столбца в результирующем наборе.
затем, вы можете использовать функцию параметризованного списка городов. dbo.GetCitiesIn ("NY"), который возвращает таблицу, которая может использоваться как соединение.
Это способ организации кода. Знать, когда что-то можно использовать повторно, а когда это пустая трата времени, можно только методом проб и ошибок. опыт.
кроме того, функции являются хорошей идеей в SQL Server. Они быстрее и могут быть довольно мощными. Встроенный и прямой выбор. Осторожно, не злоупотребляйте.
- функция обязана возвращать значение, пока оно не предназначено для хранимой процедуры.
- Select операторы принимаются только в UDF, в то время как операторы DML не требуются.
- хранимая процедура принимает любые операторы, а также операторы DML.
- UDF разрешает только входы, а не выходы.
- хранимая процедура позволяет использовать как входы, так и выходы.
- блоки Catch не могут использоваться в UDF, но могут использоваться в хранилище процедура.
- нет транзакций, разрешенных в функциях в UDF, но в хранимой процедуре они разрешены.
- в UDF можно использовать только табличные переменные, а не временные таблицы.
- хранимая процедура позволяет как табличные переменные и временные таблицы.
- UDF не позволяет вызывать хранимые процедуры из функций, в то время как хранимые процедуры позволяют вызывать функции.
- UDF используется в предложении join, в то время как хранимые процедуры не могут быть используется в предложении Join.
- хранимая процедура всегда позволяет вернуться к нулю. UDF, напротив, имеет значения, которые должны вернуться в заданную точку.
вот практическая причина предпочесть функции хранимым процедурам. Если у вас есть хранимая процедура, которая нуждается в результатах другой хранимой процедуры, необходимо использовать инструкцию insert-exec. Это означает, что вам нужно создать временную таблицу и использовать exec
инструкция для вставки результатов хранимой процедуры во временную таблицу. Это грязно. Одна из проблем с этим заключается в том, что insert-execs не может быть вложенным.
Если вы застряли с хранимыми процедурами это вызов других хранимых процедур, вы можете столкнуться с этим. Если вложенная хранимая процедура просто возвращает набор данных, его можно заменить табличной функцией, и вы больше не получите эту ошибку.
(это еще одна причина, по которой мы должны держать бизнес-логику из базы данных)
функции могут использоваться в инструкции select, где as процедуры не могут.
хранимая процедура принимает как входные, так и выходные параметры, но функции принимают только входные параметры.
функции не могут возвращать значения типа text, ntext,image & timestamps, где могут быть процедуры.
функции могут использоваться как пользовательские типы данных в create table, но процедуры не может.
***например:-создать table <tablename>(name varchar(10),salary getsal(name))
здесь getsal-это определяемая пользователем функция, которая возвращает тип зарплаты, при создании таблицы для типа зарплаты не выделяется хранилище, а функция getsal также не выполняется, но когда мы извлекаем некоторые значения из этой таблицы, функция getsal get выполняется и возвращает Тип возвращается как результирующий набор.
в SQL Server функции и хранимые процедуры - это два разных типа сущностей.
: в базе данных SQL Server функции используются для выполнения некоторых действий, и действие немедленно возвращает результат. Функции бывают двух типов: