3

現在、SMO と C# を使用してデータベースを走査し、2 つのデータベースのさまざまな側面を表す設定のツリーを作成してから、これらのツリーを比較して、それらがどこでどのように異なるかを確認しています。

問題は、2 つの適度なサイズのデータ​​ベースの場合、それらをローカルでクロールし、比較したいテーブル/列/ストアド プロシージャの情報を収集するのに約 10 分かかることです。

このような方法でデータベースにアクセスするための SMO よりも優れたインターフェイスはありますか? 追加の依存関係を含めたくありませんが、50% の速度向上のためにその手間を惜しみません。以下は、テーブルと列を列挙する方法のサンプルです。

        Microsoft.SqlServer.Management.Smo.Database db = db_in;
        foreach (Table t in db.Tables)
        {
            if (t.IsSystemObject == false)
            {

                foreach (Column c in t.Columns)
                {
                }                    
            }
        }
4

3 に答える 3

8

アクセスに対してクエリを実行する代わりに、SMO にすべての必須フィールドを一度に読み取らせるようにしてください。詳しくはこちらのブログをご覧ください


編集: リンクは死んでいますが、archive.orgでページを見つけました。関連するコードは次のとおりです。

Server server = new Server();

// Force IsSystemObject to be returned by default.
server.SetDefaultInitFields(typeof(StoredProcedure), "IsSystemObject");

StoredProcedureCollection storedProcedures = server.Databases["AdventureWorks"].StoredProcedures;

foreach (StoredProcedure sp in storedProcedures) {
    if (!sp.IsSystemObject) {
        // We only want user stored procedures
    }
}
于 2008-12-30T22:59:06.990 に答える
2

各データベースでシステム ビューを使用し、従来どおりクエリを実行します。

http://www.microsoft.com/downloads/details.aspx?familyid=2EC9E842-40BE-4321-9B56-92FD3860FB32&displaylang=en

于 2008-12-30T22:52:30.137 に答える
0

TSQL クエリを介して取得できないものはほとんどありません。通常、この方法でメタデータを取得するのは非常に高速です。

于 2008-12-30T23:21:14.290 に答える