Функция и хранимая процедура в SQL Server
Я изучал функции и хранимую процедуру довольно долго, но я не знаю, почему и когда я должен использовать функцию или хранимую процедуру. Они выглядят одинаково для меня, может быть, потому что я новичок в этом.
может кто-нибудь сказать мне, почему?
17 ответов:
функции являются вычисляемыми значениями и не могут выполнять постоянные изменения среды в SQL Server (т. е. не разрешены инструкции INSERT или UPDATE).
функция может быть использована inline в SQL-операторах, если она возвращает скалярное значение, или может быть объединена, если она возвращает результирующий набор.
момент, который стоит отметить из комментариев, которые суммируют ответ. Спасибо @Sean K Anderson:
функции следуют определению computer-sciency при этом они должны возвращать значение и не могут изменять данные, которые они получают в качестве параметров (аргумент.) Функции не могут ничего изменить, должны имейте хотя бы один параметр, и они должны возвращать значение. На хранении 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)
.хранимые procs используются для связывания 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.
- хранимые процедуры поддерживают отложенное разрешение имен.
- хранимые процедуры обычно используются для выполнения бизнес-логики.
- хранимые процедуры могут возвращать любой тип данных.
- хранимые процедуры могут принимать большее количество входных параметров, чем задано пользователем функции. На хранении процедуры могут иметь до 21 000 входных параметров.
- хранимые процедуры могут выполнять динамический SQL.
- хранимые процедуры поддерживают обработку ошибок.
- в хранимых процедурах могут использоваться недетерминированные функции.
- в операторах Select можно использовать пользовательские функции.
- пользовательские функции не поддерживают отложенное разрешение имен.
- пользовательские функции обычно используются для вычисления.
- пользовательские функции должны возвращать значение.
- пользовательские функции не могут возвращать изображения.
- пользовательские функции принимают меньшее число входных параметров, чем хранимые процедуры. Пользовательские функции могут иметь до 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. Вы можете использовать его встроенным в инструкцию SQL, например so
SELECT a, lookupValue(b), c FROM customers
здесь
lookupValue
будет UDF. Такая функциональность невозможна при использовании хранимой процедуры. В то же время вы не можете делать определенные вещи внутри ОДС. Основное, что нужно помнить здесь, это то, что UDF:
- невозможно создать постоянные изменения
- не удается изменить данные
хранимая процедура может делать такие вещи.
для меня рядный использование UDF является наиболее важным использованием пользовательской функции.
Хранимых Процедуриспользуются как скрипты. Они выполняют ряд команд для вас, и вы можете запланировать их выполнение в определенное время.
функциииспользуются в качестве методов. вы передаете ему что-то, и он возвращает результат. Должен быть маленький и быстрый - это на лету.
хранимая процедура:
- это как миниатюрная программа в SQL Server.
- может быть простым, как оператор select, или сложным, как длинный скрипт, который добавляет, удаляет, обновляет и/или считывает данные из нескольких таблицы в базе данных.
- (можете реализовать циклы и курсоры, которые позволяют работать с меньшие результаты или построчные операции с данными.)
- должен быть вызван с помощью
EXEC
илиEXECUTE
заявление.- возвращает переменные таблицы, но мы не можем использовать
чтобы решить, когда использовать то, что следующие пункты могут помочь -
хранимые процедуры не могут возвращать табличную переменную, где это может сделать функция as.
вы можете использовать хранимые процедуры для изменения параметров среды сервера, где как с помощью функций вы не можете.
ура
функции SQL Server, такие как курсоры, предназначены для использования в качестве вашего последнего оружия! У них есть проблемы с производительностью, и поэтому использование возвращающей табличное значение функции следует избегать как можно больше. Говоря о производительности, мы говорим о таблице с более чем 1 000 000 записей, размещенных на сервере на оборудовании среднего класса; в противном случае вам не нужно беспокоиться о производительности, вызванной функциями.
- никогда не используйте функцию для возврата результирующего набора в внешний код (например ADO.Net)
- использовать представления/хранимые как можно больше различных комбинаций. вы можете оправиться от будущих проблем с ростом производительности, используя предложения 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.
начните с функций, которые возвращают одно значение. Самое приятное, что вы можете поместить часто используемый код в функцию и вернуть их в виде столбца в результирующем наборе.
затем, вы можете использовать функцию параметризованного списка городов. ДБО.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 but procedures не может.
***например:-создать
table <tablename>(name varchar(10),salary getsal(name))
здесь getsal-это пользовательская функция, которая возвращает тип зарплаты, когда создается таблица, для типа зарплаты не выделяется хранилище, а функция getsal также не выполняется, но когда мы извлекаем некоторые значения из этой таблицы, функция getsal get выполняется и возвращается Тип возвращается в качестве результирующего набора.