我很想知道我们可以在sql server的函数中使用DML命令,如insert / update / delete。
答案 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