106

SQL Server Management Studio 2008 でスクリプトの生成を自動化したいと考えています。

今私がしていることは次のとおりです。

  • 私のデータベース、タスク、「スクリプトの生成...」を右クリックします
  • 必要なすべてのエクスポート オプションを手動で選択し、[オブジェクトの選択] タブで [すべて選択] をクリックします。
  • エクスポートフォルダを選択
  • 最後に「完了」ボタンを押す

このタスクを自動化する方法はありますか?

編集:スクリプトを変更するのではなく、作成スクリプトを生成したい。

4

14 に答える 14

46

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();
于 2012-07-25T17:27:06.717 に答える
31

Brann が Visual Studio 2008 SP1 Team Suite で言及しているのは、データベース公開ウィザードのバージョン 1.4 です。\Program Files\Microsoft SQL Server\90\Tools\Publishing\1.4 に SQL Server 2008 (おそらくプロフェッショナルのみ?) と共にインストールされます。サーバー エクスプローラーからの VS 呼び出しは、単にこれを呼び出しています。次のようなコマンドラインを使用して同じ機能を実現できます。

sqlpubwiz help script

v1.4 に v1.1 と同じ問題 (ユーザーがロールに変換される、制約が正しい順序で作成されない) があるかどうかはわかりませんが、オブジェクトをスクリプト化しないため、解決策にはなりません。 SSMS の Tasks->Generate Scripts オプションのように、さまざまなファイルに変換します。私は現在、データベース公開ウィザード (sqlpubwiz.exe) の改良版として機能するように、修正バージョンの Scriptio (MS SMO API を使用) を使用しています。現在、コマンド ラインからスクリプトを作成することはできません。将来、その貢献を追加する可能性があります。

Scriptio は、もともと Bill Graziano のブログに投稿されていましたが、その後、Bill によって CodePlex にリリースされ、他の人によって更新されました。説明を読んで、SQL Server 2008 で使用するためにコンパイルする方法を確認してください。

http://scriptio.codeplex.com/

編集:以来、これを行うために RedGate の SQL Compare 製品を使用し始めました。これは、SQL パブリッシング ウィザードが本来あるべきだったすべてのものに取って代わる非常に優れたものです。ソースとしてデータベース、バックアップ、またはスナップショットを選択し、出力場所としてフォルダーを選択すると、すべてが適切にフォルダー構造にダンプされます。たまたま、他の製品である SQL Source Control が使用するのと同じ形式です。

于 2010-05-06T18:06:16.380 に答える
22

これを行うSchemaZenという名前のオープン ソース コマンド ライン ユーティリティを作成しました。これは、管理スタジオからスクリプトを作成するよりもはるかに高速であり、出力はバージョン管理に適しています。スキーマとデータの両方のスクリプト作成をサポートしています。

スクリプトを生成するには、次を実行します。

schemazen.exe スクリプト --server localhost --database db --scriptDir c:\somedir

次に、スクリプトを実行してデータベースを再作成します。

schemazen.exe create --server localhost --database db --scriptDir c:\somedir
于 2013-09-06T17:17:51.120 に答える
12

SQL Server管理オブジェクト(SMO)を使用して、スクリプトの生成を含むSQLServer2005管理タスクを自動化できます。http://msdn.microsoft.com/en-us/library/ms162169.aspx

于 2009-01-27T14:41:51.340 に答える
8

あなたが開発者なら、間違いなく SMO を選んでください。以下は、出発点となる Scripter クラスへのリンクです。

スクリプタークラス

于 2009-01-27T15:01:46.133 に答える
7

これらの回答のいずれにも記載されているSQLPSXを使用したpowershellは見当たりません...私は個人的にそれを使ったことはありませんが、美しく使いやすく、このタイプの自動化タスクに理想的に適しているように見えます。

Get-SqlDatabase -dbname test -sqlserver server | Get-SqlTable | Get-SqlScripter | Set-Content -Path C:\script.sql
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlStoredProcedure | Get-SqlScripter
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlView | Get-SqlScripter

(参照: http://www.sqlservercentral.com/Forums/Topic1167710-1550-1.aspx#bm1168100 )

プロジェクト ページ: http://sqlpsx.codeplex.com/

このアプローチの主な利点は、SMO を直接使用することによる構成可能性とカスタマイズ可能性と、データベース公開ウィザードのような単純な既存のツールを使用することによる利便性と保守性を兼ね備えていることです。

于 2011-10-13T06:55:46.643 に答える
4

[ツール] > [オプション] > [デザイナ] > [テーブルおよびデータベース デザイナ] には、保存時に行ったすべての変更に対してスクリプトを生成する [変更スクリプトの自動生成] のオプションがあります。

于 2009-01-27T14:27:24.863 に答える
3

Microsoftソリューションが必要な場合は、次のことを試すことができます。MicrosoftSQLServerデータベース公開ウィザード1.1

http://www.microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en

スクリプトを再構築する必要があるときにいつでも実行できるバッチプロセスを作成します。

于 2009-01-27T14:57:44.363 に答える
3

これは、INFORMATION_SCHEMAテーブルを使用してT-SQLコードで実行できます。

サードパーティのツールもあります-私はあなたが話している正確な使用法のためにApexSQLスクリプトが好きです。コマンドラインから完全に実行します。

于 2009-01-27T14:36:13.440 に答える
3

新しい SQL Server コマンド ライン ツールを試して、T-SQL スクリプトを生成し、動的管理ビューを監視します。

魅力のように私のために働いた。これは、コマンド ラインから実行する Microsoft の新しい Python ベースのツールです。Microsoftのページで説明されているようにすべてが機能します(以下のリンクを参照)SQL 2012サーバーで機能しました。

pipでインストールします:

$pip install mssql-scripter

コマンド パラメータの概要は通常どおり h を使用してヘルプを表示します。

mssql-scripter -h

ヒント: Windows 認証を介して SQL-Server にログインする場合は、ユーザー名とパスワードをそのままにしておいてください。

https://cloudblogs.microsoft.com/sqlserver/2017/05/17/try-new-sql-server-command-line-tools-to-generate-t-sql-scripts-and-monitor-dynamic-management-ビュー/

于 2019-01-29T12:35:48.447 に答える
2

私は DB Comparer を使用してきました。これは無料で大騒ぎせずに DB 全体をスクリプト化し、別の DB と比較したり、Diff スクリプトを生成したりできます。開発から本番への変更スクリプトに最適です。 http://www.dbcomparer.com/

于 2011-11-30T08:30:14.747 に答える
1

必要に応じて作成したこの単純なコマンド ライン ツールもあります。
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/

データベース全体をエクスポートでき、暗号化されたオブジェクトをエクスポートしようとします。簡単にファイルを比較できるように、すべてがフォルダーと個別の sql ファイルに保存されます。

コードは github でも入手できます。

于 2013-11-27T14:04:32.677 に答える
0

私はVS 2012を使用しています(MSSQL Server 2008のDB用)比較データベースには、それを保存するオプション、比較とオプションがあります。これは基本的に配信の設定です。その後、スクリプトを更新または生成できます。

ソリューションエクスプローラーにファイルが表示されないため、後でファイルからロードするのは少し面倒です(Windowsエクスプローラーからドラッグアンドドロップします)。

于 2015-07-07T07:44:21.177 に答える
0

Visual Studio 2008 SP1 TeamSuite から:

[サーバー エクスプローラー] の [データ接続] タブには、「Microsoft SQL Server データベース公開ウィザード」と同じことを行うプロバイダー ツールへの公開がありますが、MS Sql Server 2008 と互換性があります。

于 2009-01-27T15:12:18.797 に答える