Мне любопытно узнать, можем ли мы использовать команды DML, такие как insert / update / delete, в функциях на сервере sql.

1
Dhivya Manivannan 13 Мар 2018 в 10:02

2 ответа

Лучший ответ

В Micosoft SQL Server функции не могут создавать побочные эффекты. Это означает, что вы не можете изменять состояние базы данных (изменять данные, доступные за пределами области действия функции) внутри функции, хотя вы можете выполнить SELECT DML. Ниже приведен пример сценария, иллюстрирующий это.

CREATE TABLE dbo.Test(SomeData int IDENTITY);
GO
CREATE FUNCTION dbo.BadFunction(@SomeData int)
RETURNS int
AS
BEGIN
    INSERT INTO dbo.Test (SomeData) VALUES(@SomeData);
    RETURN SCOPE_IDENTITY();
END;
GO

Функция не будет создана из-за этой ошибки:

Msg 443, уровень 16, состояние 15, неправильная функция процедуры, строка 6 [Batch Start Line 4] Недопустимое использование побочного оператора INSERT в функции.

Функция create будет успешной, если вместо обычной таблицы будет использоваться табличная переменная, потому что область видимости табличной переменной ограничена внутри функции:

CREATE FUNCTION dbo.GoodFunction(@SomeData int)
RETURNS int
AS
BEGIN
    DECLARE @TableVariable TABLE(ID int IDENTITY, SomeData int);
    INSERT INTO @TableVariable (SomeData) VALUES(@SomeData);
    RETURN SCOPE_IDENTITY();
END;
GO
0
Dan Guzman 14 Мар 2018 в 09:54

Короче говоря: Да

А если вам интересно, вы можете прочитать следующую статью: СОЗДАТЬ ФУНКЦИЮ (Transact-SQL )

А если вам лень, вот отрывок из этой статьи:

Следующие утверждения действительны в функции:

  • Заявления о переуступке.
  • Операторы управления потоком, кроме операторов TRY ... CATCH.
  • Операторы DECLARE, определяющие локальные переменные данных и локальные курсоры.
  • Операторы SELECT, содержащие списки выбора с выражениями, которые присваивают значения локальным переменным.
  • Операции с курсорами, ссылающиеся на локальные курсоры, которые объявлены, открыты, закрыты и освобождены в функции. Только операторы FETCH которые присваивают значения локальным переменным с помощью предложения INTO, разрешается; Операторы FETCH, возвращающие данные клиенту, не являются разрешается.
  • Операторы INSERT, UPDATE и DELETE, изменяющие локальные переменные таблицы.
  • Операторы EXECUTE, вызывающие расширенные хранимые процедуры.
0
VisheshNayak 13 Мар 2018 в 07:18