通过SMO生成的脚本无法执行

时间:2018-08-06 15:08:06

标签: c# sql-server smo

我正在使用Smo创建现有数据库的SQL脚本。为了进行测试,我删除了数据库并将脚本复制到新的查询中以再次创建它。 不幸的是,此过程会产生错误。

'CREATE VIEW' must be the first statement in a query batch

由于我正在创建多个视图,因此该错误在SQL Server Management Studio的“消息”选项卡上多次显示。 当我寻找解决方案时,我发现“创建视图”之前的关键字“转到”显然丢失了。 在“ ScriptingOptions”类中是否包含一个选项,可以在生成的脚本中附加“ GO”?

代码:

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)
        {
            if (!t.IsSystemObject)
            {
                StringCollection sc = t.Script(scriptopt);
                foreach (string s in sc)
                {
                    sb.AppendLine(s);
                }
            }

        }

        //Script Stored Procedures
        foreach (StoredProcedure sp in db.StoredProcedures)
        {
            if (!sp.IsSystemObject)
            {
                var sc = sp.Script(scriptopt);
                foreach (string s in sc)
                {
                    sb.AppendLine(s);
                }
            } 

        }

        //Views
        foreach(View v in db.Views){
            if (!v.IsSystemObject)
            {
                StringCollection sc = v.Script(scriptopt);
                foreach (string s in sc)
                {
                    sb.AppendLine(s);
                }
            }

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

    }

3 个答案:

答案 0 :(得分:0)

您要查找的属性称为“ NoCommandTerminator”。将其设置为false,您应该会很好。 我通过反复试验发现了这一点。实际上,我也正在使用SMO,并且正在将ScriptingOptions序列化为XML文件,以便以后可以对其进行更改。在我的配置中,我还说了帮助,如何配置它,这一行是我为添加GO语句编写的:

unwind

答案 1 :(得分:0)

坏消息,你是SOL

批处理终止符仅进入文件,而与任何选项/标志无关:(

我想出的唯一方法是设置Options.ToFileOnly = $ true,将其脚本化到临时位置并获取内容

是的,MS决定输出文件和字符串集合包含不同的内容。

答案 2 :(得分:0)

哇,看起来有人建立了相同的工具,这让我很兴奋。 我的经验是,您需要在创建脚本中手动附加GO关键字。如果您编写的脚本包含Go关键字,则无法通过SqlConnection执行 并且只能由SMO ConnectionContext执行 例如

smoServer.ConnectionContext.BeginTransaction();
var result = smoServer.ConnectionContext.ExecuteNonQuery(_createViewScript);
smoServer.ConnectionContext.CommitTransaction();