6

私はこれを尋ねるだけで愚か者のように感じますが、Google から何の助けも得られず、SMO の単純な検索で SO のすべての結果をページングしましたが、それも表示されませんでした.

短いバージョンは、私が T4 をいじり始めているということです。私はOleg Sych の最初のチュートリアルを拡張して、すべてのテーブルの列挙を提供し、(私見ではばかげた) 削除プロシージャを作成します。これは単なる実験なので、まったく役に立たなくても問題ありません。:)

Oleg のチュートリアルへの拡張は次のようになります。

<#@ template language="C#" hostspecific="true" #>
<#@ output extension="SQL" #>
<#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #>
<#@ assembly name="Microsoft.SqlServer.Smo" #>
<#@ import namespace="Microsoft.SqlServer.Management.Smo" #>
<#@ include file="T4Toolbox.tt" #>
<#
    // Config variables
    string serverName = "dbserver\\dbinstance";
    string dbName = "dbname";
#>
USE <#= dbName #>
<#  
    // Iterate over tables and generate procs
    Server server = new Server(serverName);
    Database database = new Database(server, dbName);

    WriteLine("/* Number of tables: " + database.Tables.Count.ToString() + " */");

    foreach (Table table in database.Tables)
    {
        table.Refresh();
#>
CREATE PROCEDURE <#= table.Name #>_Delete
<#
        PushIndent("    ");
        foreach (Column column in table.Columns)
        {
            if (column.InPrimaryKey)
                WriteLine("@" + column.Name + " " + column.DataType.Name);
        }
        PopIndent();
#>
AS
    DELETE FROM 
        <#= table.Name #>
    WHERE
<#
        PushIndent("        ");
        foreach (Column column in table.Columns)
        {
            if (column.InPrimaryKey)
                WriteLine(column.Name + " = @" + column.Name);
        }
        PopIndent();
        WriteLine("GO");
    }
#> 

Tables問題は、コレクションからテーブルが返されないことです。これは、私が生成しているテーブル カウントの SQL コメントによって検証され、出力は0.

書かれているように、上記のコードは次を生成します。

USE dbname
/* Number of tables: 0 */

ただし、for ループを削除して、このデータベースに存在する有効なテーブル名を手動で指定すると、そのテーブルに対して (これもばかげた) proc が生成されます。

テーブルはスキーマに分割されていますが、それは重要ですか? また、これは SQL2005 インスタンスに反するものです。問題が発生する可能性はありますか?

最後に、Synonyms コレクションを介して同義語を列挙できないこともわかりました。(テーブルはスキーマ内にあるが、同義語が定義されているので、私は賢くてそのルートに行くと思っていました。しかし...サイコロはありません。)

繰り返しますが、上記のコードは当然製品ではなく、製品に値するものでもありません。私は T4 と SMO の両方を学ぼうとしていますが、途方もなく単純だと思っていたことをしようとして障害にぶつかりました。:)

4

1 に答える 1

13

Databaseクラスの新しいインスタンスを作成するだけでは、SMOはメタデータを自動的に取得しません。メタデータの取得には、特に寒い環境では時間がかかる場合があります。ループの前にdatabase.Refresh()を呼び出します。

于 2009-03-05T23:01:53.670 に答える