質問

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

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

オレグのチュートリアルへの私の拡張は次のようになります:

<#@ 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ループを削除し、このデータベースに存在する有効なテーブル名を手動で指定すると、そのテーブルに対して(再び愚かな)プロシージャが生成されます。

テーブルはスキーマに分割されますが、それは重要ですか?また、これはSQL2005インスタンスに反している-それは潜在的に問題を引き起こすだろうか?

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

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

役に立ちましたか?

解決

Databaseクラスの新しいインスタンスを作成するだけでは、

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top