Почему мы не можем выполнить хранимую процедуру внутри функции в SQL Server

Почему мы не можем выполнить хранимую процедуру внутри функции, когда возможно обратное?


person user347755    schedule 24.05.2010    source источник
comment
Не могли бы вы рассказать нам, о какой СУБД вы говорите?   -  person David M    schedule 24.05.2010
comment
может быть, это поможет вам. [Можно ли вызвать хранимую процедуру в пользовательской функции?] [1] [1]: stackoverflow.com/questions/12840065/   -  person Chirag    schedule 18.12.2013


Ответы (7)


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

Это по определению (см. СОЗДАТЬ ФУНКЦИЮ - Ограничения и ограничения).

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

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

Функции существуют, чтобы просто вычислять что-то, значение или результат таблицы, не более того. Эти функции можно вызывать, например, в запросе SELECT, например.

SELECT calculate_something(a) FROM some_table;

Теперь представьте, что произойдет, если функции calculate_something будет разрешено выполнить хранимую процедуру, которая удалит все строки в some_table. Вы намереваетесь вычислить что-то, используя значение столбцов some_table.a, но в итоге... удаляете все строки в some_table. Это явно не то, чего вы хотите.

person TT.    schedule 02.09.2017

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

В дополнение к этому я хотел бы добавить, что мы не можем выбрать процедуру или поместить ее в предложение where, но мы можем сделать это с помощью функции.

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

Надеюсь это поможет.

person AtomicFlee    schedule 05.11.2018

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

person Martin Milan    schedule 24.05.2010

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

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

eg.

Create Function...

EXEC master.sys.xp_cmdshell 'C:\test.bat'

RETURN...

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

person Neil Knight    schedule 24.05.2010

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

Функции крайне ограничены. Они не могут выполнять никакие операции, которые могут изменить данные. Это означает, что вы не можете использовать динамический sql или вызывать другие объекты (кроме функций)

person Suri    schedule 24.06.2013

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

person Smruti Ranjan    schedule 19.02.2017

Технически вызов хранимой процедуры из функции возможен. Но помните назначение хранимой процедуры и функций.

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

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

person HVS    schedule 24.05.2010