在SQL Server中使用函数插入/更新/删除

Pan*_*wal 37 sql-server sql-server-2008 sql-server-2012

我们可以执行Insert/Update/Delete声明吗SQL Server Functions?我试过但是发生了SQL Server错误.

错误:

Invalid use of side-effecting or time-dependent operator in 'DELETE' within a function.
Run Code Online (Sandbox Code Playgroud)

AnyBody有任何想法,为什么我们不能使用Insert/Update/Delete语句SQL Server functions.

等待你的好主意

Mit*_*eat 73

,你不能.

从SQL Server联机丛书:

用户定义的函数不能用于执行修改数据库状态的操作.

参考.

  • 使用存储过程. (7认同)

Ant*_*ull 19

SQL Server中的函数(如数学中)不能用于修改数据库.它们只是只读的,可以帮助开发人员实现命令查询分离.换句话说,提出问题不应该改变答案.当您的程序需要修改数据库时,请使用存储过程.


小智 13

是的你可以!))

我发现了一个方法,使INSERT,UPDATEDELETE在功能上使用xp_cmdshell.

所以你只需要替换@sql变量中的代码.

CREATE FUNCTION [dbo].[_tmp_func](@orderID NVARCHAR(50))
RETURNS INT
AS
BEGIN
DECLARE @sql varchar(4000), @cmd varchar(4000)
SELECT @sql = 'INSERT INTO _ord (ord_Code) VALUES (''' + @orderID + ''') '
SELECT @cmd = 'sqlcmd -S ' + @@servername +
              ' -d ' + db_name() + ' -Q "' + @sql + '"'
EXEC master..xp_cmdshell @cmd, 'no_output'
RETURN 1
END
Run Code Online (Sandbox Code Playgroud)

  • 虽然富有创意,但我会尽力记住将来是否绝对必要,但这种方法没有交易保障。 (2认同)
  • 您需要先启用cmdshell`EXEC sp_configure'显示高级选项',1进行重新配置GO EXEC sp_configure'xp_cmdshell',1进行RECONFIGURE GO` (2认同)

Fis*_*ury 5

您不能像使用存储过程那样通过函数更新表,但是可以更新表变量。

因此,例如,您不能在函数中执行此操作:

create table MyTable
(
    ID int,
    column1 varchar(100)
)
update [MyTable]
set column1='My value'
Run Code Online (Sandbox Code Playgroud)

但您可以执行以下操作:

declare @myTable table
(
    ID int,
    column1 varchar(100)
)

Update @myTable
set column1='My value'
Run Code Online (Sandbox Code Playgroud)


Jon*_*nan 5

是的你可以。

但是,它需要具有 EXTERNAL_ACCESS 或 UNSAFE 权限的 SQL CLR 并指定连接字符串。这显然是不推荐的

例如,使用Eval SQL.NET(一个允许在 SQL 中添加 C# 语法的 SQL CLR)

CREATE FUNCTION [dbo].[fn_modify_table_state]
    (
      @conn VARCHAR(8000) ,
      @sql VARCHAR(8000)
    )
RETURNS INT
AS
    BEGIN
        RETURN SQLNET::New('
using(var connection = new SqlConnection(conn))
{
    connection.Open();

    using(var command = new SqlCommand(sql, connection))
    {
        return command.ExecuteNonQuery();
    }
}
').ValueString('conn', @conn).ValueString('sql', @sql).EvalReadAccessInt()

    END

    GO

DECLARE @conn VARCHAR(8000) = 'Data Source=XPS8700;Initial Catalog=SqlServerEval_Debug;Integrated Security=True'
DECLARE @sql VARCHAR(8000) = 'UPDATE [Table_1] SET Value = -1 WHERE Name = ''zzz'''

DECLARE @rowAffecteds INT =  dbo.fn_modify_table_state(@conn, @sql)
Run Code Online (Sandbox Code Playgroud)

文档:在 SQL 函数中修改表状态

免责声明:我是Eval SQL.NET项目的所有者