Почему мы не можем выполнить хранимую процедуру внутри функции в SQL Server - PullRequest
4 голосов
/ 24 мая 2010

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

Ответы [ 7 ]

6 голосов
/ 02 сентября 2017

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

Это по определению (см. CREATE FUNCTION - Ограничения и ограничения ).

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

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

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

SELECT calculate_something(a) FROM some_table;

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

1 голос
/ 05 ноября 2018

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

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

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

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

0 голосов
/ 19 февраля 2017

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

0 голосов
/ 24 июня 2013

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

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

0 голосов
/ 24 мая 2010

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

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

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

0 голосов
/ 24 мая 2010

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

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

например.

Create Function...

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

RETURN...

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

0 голосов
/ 24 мая 2010

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

...