我正在尝试使用 SMO 从现有数据库生成 SQL 脚本。稍后将使用此脚本来恢复没有数据的数据库。为此,我设置了一个如下所示的方法:
public void GenerateSQLScripts(string dbName)
{
StringBuilder sb = new StringBuilder();
Server server = new Server(SqlServer);
Database db = server.Databases[dbName];
var scriptopt = new ScriptingOptions();
scriptopt.TargetServerVersion = SqlServerVersion.Version105; // Windows 2008 R2
scriptopt.AnsiPadding = true;
scriptopt.WithDependencies = true;
scriptopt.IncludeHeaders = true;
scriptopt.SchemaQualify = true;
scriptopt.ExtendedProperties = true;
scriptopt.TargetDatabaseEngineType = DatabaseEngineType.Standalone;
scriptopt.IncludeDatabaseContext = true;
scriptopt.ScriptDrops = false;
scriptopt.ScriptData = false;
scriptopt.ScriptSchema = true;
scriptopt.DriAllConstraints = true;
scriptopt.DriForeignKeys = true;
scriptopt.Indexes = true;
scriptopt.DriPrimaryKey = true;
scriptopt.DriUniqueKeys = true;
scriptopt.DriChecks = true;
scriptopt.AllowSystemObjects = false;
scriptopt.AppendToFile = false;
scriptopt.ScriptBatchTerminator = true;
// script Tables
foreach (Table t in db.Tables)
{
if (!t.IsSystemObject)
{
StringCollection sc = t.Script(scriptopt);
foreach (string s in sc)
{
sb.AppendLine(s);
}
}
}
此方法创建一个 SQL 文件,其中包含Create Table针对相同表的多个语句。每次引用表时都会发生这种情况,无论它是否存在。我通过关闭 WithDependencies 找到了解决此问题的方法:
scriptopt.WithDependencies = false;
现在脚本要小得多,因为没有额外的语句。但是由于我的语句中没有顺序,因此某些表正在引用当时不存在的其他表。经过一番研究,我找到了DependencyWalker类。
由于测试目的,其余的源代码不受影响。现在我遇到了和以前一样的错误。我的脚本充满了多个Create Table语句,Table already exists即使关闭了该选项也会导致错误。
MMMHUHU
吃鸡游戏
墨色风雨
相关分类