C #: генерировать SQL-скрипт из базы данных, содержащей «use master» - PullRequest
0 голосов
/ 05 июля 2018

Я работаю над небольшим инструментом, который позволяет генерировать сценарий SQL для существующей базы данных. Сценарий создается без каких-либо проблем, но при тестировании сценария путем его выполнения в SQL Server Management Studio возникает ошибка, в которой указано, что имя объекта одной из моих таблиц недопустимо.

Итак, я сгенерировал скрипт вручную, и единственное отличие было в самом начале скрипта. Сценарий, созданный моим инструментом, содержит строку use ClientND, тогда как сценарий, созданный вручную, содержит use master.

Из-за этого я думаю, что это является источником ошибки, поэтому я попытался найти подходящий вариант в ScriptingOptions, но безрезультатно.

Есть ли способ включить use master вместо use dbName?

Код:

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;

    // script Tables
    foreach (Table t in db.Tables)
    {
        StringCollection sc = t.Script(scriptopt);

        foreach (string s in sc)
        {
            sb.AppendLine(s);
        }
    }

    File.WriteAllText(path, sb.ToString());
}
...