0

我正在尝试使用简单的 CLR 函数来备份 sql 数据库。

[SqlFunction(DataAccess = DataAccessKind.Read)]
public static int BackupDb()
{
    using (var conn = new SqlConnection("context connection=true"))
    {
        conn.Open();
        var cmd = new SqlCommand(
            @"backup database MyDatabase to disk='d:\temp\MyDatabase.bak' WITH INIT, STATS=10", conn);
        cmd.ExecuteNonQuery();
    }
    return 0;
}

但是此代码给出异常消息 6522,级别 16,状态 1,行 1 执行用户定义的例程或聚合“BackupDb”期间发生 .NET Framework 错误:System.Data.SqlClient.SqlException:无效使用副作用函数中的运算符“备份数据库”。System.Data.SqlClient.SqlException:在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection,操作1 wrapCloseInAction) at System.Data.SqlClient.SqlCommand.RunExecuteNonQuerySmi(Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 完成,字符串方法名,布尔 sendToPipe,Int32 超时,布尔 asyncWrite)在 System.Data.SqlClient.SqlCommand。 ExecuteNonQuery() 在 UserDefinedFunctions.BackupDb()

4

1 回答 1

1

您不能从函数中更改数据库。就这么简单。并且备份数据库确实会更改该数据库(特别是它如何处理事务日志的部分)

如果您想要 a) 可以进入 SQL Server,b) 允许您编写 c# 代码,以及 c) 让您对数据库进行更改,符合该定义的唯一对象是CLR 存储过程

于 2013-10-23T11:51:49.433 回答