sql >> データベース >  >> RDS >> Sqlserver

SQL Server Management Studio 2008でスクリプトの生成タスクを自動化するにはどうすればよいですか?

    SqlPubwizには、SSMSでのスクリプト生成と比較して非常に限られたオプションがあります。対照的に、SMOで使用できるオプションは、SSMSのオプションとほぼ完全に一致しており、おそらく同じコードである可能性があります。 (MSが2回記述しないことを願っています!)MSDNには、スクリプトテーブルを個々のオブジェクトとして示すこのような例がいくつかあります。ただし、外部キーなどの「DRI」(宣言型参照整合性)オブジェクトを含む「完全な」スキーマを使用してすべてを正しくスクリプト化する場合は、テーブルを個別にスクリプト化しても依存関係が正しく機能しません。すべてのURNを収集し、それらを配列としてスクリプト作成者に渡す必要があることがわかりました。例から変更されたこのコードは、私にとっては機能します(ただし、整理してもう少しコメントすることができます):

        using Microsoft.SqlServer.Management.Smo;
        using Microsoft.SqlServer.Management.Sdk.Sfc;
        // etc...
    
        // Connect to the local, default instance of SQL Server. 
        Server srv = new Server();
    
        // Reference the database.  
        Database db = srv.Databases["YOURDBHERE"];
    
        Scripter scrp = new Scripter(srv);
        scrp.Options.ScriptDrops = false;
        scrp.Options.WithDependencies = true;
        scrp.Options.Indexes = true;   // To include indexes
        scrp.Options.DriAllConstraints = true;   // to include referential constraints in the script
        scrp.Options.Triggers = true;
        scrp.Options.FullTextIndexes = true;
        scrp.Options.NoCollation = false;
        scrp.Options.Bindings = true;
        scrp.Options.IncludeIfNotExists = false;
        scrp.Options.ScriptBatchTerminator = true;
        scrp.Options.ExtendedProperties = true;
    
        scrp.PrefetchObjects = true; // some sources suggest this may speed things up
    
        var urns = new List<Urn>();
    
        // Iterate through the tables in database and script each one   
        foreach (Table tb in db.Tables)
        {
            // check if the table is not a system table
            if (tb.IsSystemObject == false)
            {
                urns.Add(tb.Urn);
            }
        }
    
        // Iterate through the views in database and script each one. Display the script.   
        foreach (View view in db.Views)
        {
            // check if the view is not a system object
            if (view.IsSystemObject == false)
            {
                urns.Add(view.Urn);
            }
        }
    
        // Iterate through the stored procedures in database and script each one. Display the script.   
        foreach (StoredProcedure sp in db.StoredProcedures)
        {
            // check if the procedure is not a system object
            if (sp.IsSystemObject == false)
            {
                urns.Add(sp.Urn);
            }
        }
    
        StringBuilder builder = new StringBuilder();
        System.Collections.Specialized.StringCollection sc = scrp.Script(urns.ToArray());
        foreach (string st in sc)
        {
            // It seems each string is a sensible batch, and putting GO after it makes it work in tools like SSMS.
            // Wrapping each string in an 'exec' statement would work better if using SqlCommand to run the script.
            builder.AppendLine(st);
            builder.AppendLine("GO");
        }
    
        return builder.ToString();
    


    1. Android:InsertHelperが非推奨の場合の一括挿入

    2. SqlAlchemyとcx_Oracleを使用してPandasDataFrameをOracleデータベースに書き込む場合は、to_sql()を高速化します

    3. 存在しない場所に値を挿入

    4. VSエンティティフレームワークのOracleエンティティは、コードの主キーを更新しません