Domanda

Mi sento un idiota solo per averlo chiesto, ma non ricevo alcun aiuto da Google e ho sfogliato tutti i risultati di SO su una semplice ricerca di SMO e non l'ho nemmeno visto.

La versione breve è che sto iniziando a giocare con T4. Mi sto espandendo su Tutorial iniziale di Oleg Sych per fornire l'enumerazione su tutte le tabelle per creare un proc (IMHO piuttosto sciocco) di eliminazione. Questo è solo un esperimento, quindi la sua totale inutilità non mi disturba. :)

La mia espansione al tutorial di Oleg è simile a questa:

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

Il problema è che nessuna tabella viene restituita dalla raccolta Tables . Ciò è validato dal commento SQL sul conteggio delle tabelle che sto generando, che genera 0 .

Come scritto, il codice sopra genera quanto segue:

USE dbname
/* Number of tables: 0 */

Tuttavia, se rimuovo il ciclo for e fornisco manualmente un nome di tabella valido che esiste in questo database, genera il proc (di nuovo stupido) per quella tabella.

Le tabelle sono separate in uno schema, sarebbe importante? Inoltre, ciò andrà contro un'istanza di SQL2005: ciò potrebbe potenzialmente causare problemi?

Infine, sto anche scoprendo che non posso enumerare i sinonimi tramite la raccolta Sinonimi. (Ho pensato di essere intelligente e seguire questa strada poiché le tabelle sono in uno schema, ma hanno dei sinonimi definiti. Ma ... niente dadi.)

Ancora una volta, per ribadire, il codice sopra riportato non è naturalmente produzione, né produzione degna. Sto solo cercando di imparare sia T4 che SMO, e colpisco un blocco stradale cercando di fare qualcosa che pensavo sarebbe ridicolmente semplice. :)

È stato utile?

Soluzione

SMO non recupera automaticamente i metadati se si crea semplicemente una nuova istanza della classe Database. Il recupero dei metadati può richiedere del tempo, soprattutto in un ambiente freddo. Chiama database.Refresh () prima del ciclo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top