我们可以在sql函数中使用DML命令吗?

时间:2018-03-13 07:02:43

标签: sql-server tsql

我很想知道我们可以在sql server的函数中使用DML命令,如insert / update / delete。

2 个答案:

答案 0 :(得分:0)

简而言之:

如果您对此感兴趣,可以阅读以下文章: CREATE FUNCTION (Transact-SQL)

如果你感到懒惰,这篇文章的片段就是:

  

以下陈述在函数中有效:

     
      
  • 作业陈述。
  •   
  • 除了TRY ... CATCH语句之外的Control-of-Flow语句。
  •   
  • 定义本地数据变量和本地游标的DECLARE语句。
  •   
  • SELECT语句,其中包含带有表达式的选择列表,这些表达式为本地变量赋值。
  •   
  • 引用在函数中声明,打开,关闭和取消分配的本地游标的游标操作。只有FETCH语句   使用INTO子句为本地变量赋值是   允许;将数据返回给客户端的FETCH语句不是   允许的。
  •   
  • 修改本地表变量的INSERT,UPDATE和DELETE语句。
  •   
  • 调用扩展存储过程的EXECUTE语句。
  •   

答案 1 :(得分:0)

在Micosoft SQL Server中,函数cannot produce side-effects。这意味着您无法在函数内修改数据库状态(更改函数范围之外的可用数据),尽管您可以执行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,Level 16,State 15,Procedure BadFunction,Line 6 [Batch   开始第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