Frage

Ich fühle mich wie ein Depp gerade dies für die Frage, aber ich bin keine Hilfe von Google bekommen, und ich durch alle SO die Ergebnisse auf einer einfachen Suche nach SMO ausgelagert und es hat auch nicht sehen.

Die kurze Version ist, dass ich beginne mit T4 zu spielen, um. Ich erweitere auf Oleg Sych anfängliche Tutorial Aufzählung über alle Tabellen, um eine (IMHO ziemlich dumm) löschen proc zu erstellen. Dies ist nur ein Experiment, so seine völlige Nutzlosigkeit stört mich nicht. :)

Meine Expansion Oleg Tutorial sieht wie folgt aus:

<#@ 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");
    }
#> 

Das Problem ist, dass keine Tabellen aus der Tables Sammlung zurückgegeben werden. Dies wird durch die Tabelle zählen SQL Kommentar validierten Ich Erzeugung, die 0 ausgibt.

Wie schon geschrieben, der obige Code erzeugt die folgenden:

USE dbname
/* Number of tables: 0 */

Wenn ich jedoch die for-Schleife entfernen und manuell einen gültigen Tabellennamen angeben, die in dieser Datenbank vorhanden ist, erzeugt er die (wieder albern) proc - für die Tabelle

.

Die Tabellen werden in ein Schema getrennt, würden diese Angelegenheit? Auch dies wird gegen eine SQL2005 Instanz - würde, dass möglicherweise Probleme verursachen

Schließlich ich finde auch, dass ich nicht Synonyme über die Synonyme Sammlung aufzählen kann. (Ich dachte, ich klug wäre, und diesen Weg gehen, da die Tabellen in einem Schema, sondern haben Synonyme definiert. Aber ... keine Würfel.)

Auch hier zu wiederholen, ist der obige Code natürlich nicht die Produktion, noch die Produktion würdig. Ich versuche nur, beide T4 und SMO zu lernen, und schlug eine Straßensperre zu versuchen, etwas zu tun, was ich gedacht hatte wäre lächerlich einfach sein. :)

War es hilfreich?

Lösung

SMO nicht abrufen Metadaten nicht automatisch, wenn Sie einfach eine neue Instanz der Datenbank-Klasse erstellen. Abrufen von Metadaten kann eine Weile dauern, vor allem in einer kalten Umgebung. Rufen database.Refresh () vor der Schleife.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top