Pregunta

Me siento como un idiota solo por preguntar esto, pero no recibo ninguna ayuda de Google, y busqué todos los resultados de SO en una búsqueda simple de SMO y tampoco lo vi.

La versión corta es que estoy empezando a jugar con T4. Estoy ampliando el tutorial inicial de Oleg Sych para proporcionar la enumeración en todas las tablas para crear un proceso de eliminación (IMHO bastante tonto). Esto es solo un experimento, por lo que su total inutilidad no me molesta. :)

Mi expansión al tutorial de Oleg se ve así:

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

El problema es que no se devuelven tablas de la colección Tables . Esto se valida mediante el comentario de SQL que estoy generando en la tabla, que genera 0 .

Tal como está escrito, el código anterior genera lo siguiente:

USE dbname
/* Number of tables: 0 */

Sin embargo, si elimino el bucle for y proporciono manualmente un nombre de tabla válido que existe en esta base de datos, genera el proceso (de nuevo tonto) para esa tabla.

Las tablas están separadas en un esquema, ¿eso importaría? Además, esto va en contra de una instancia de SQL2005, ¿eso podría causar problemas?

Finalmente, también encuentro que no puedo enumerar los sinónimos a través de la colección de Sinónimos. (Pensé que sería inteligente e iría por esa ruta ya que las tablas están en un esquema, pero tienen sinónimos definidos. Pero ... no hay dados).

Nuevamente, para reiterar, el código anterior naturalmente no es producción, ni siquiera producción digna. Solo estoy tratando de aprender tanto T4 como SMO, y estoy en una barricada tratando de hacer algo que pensé que sería ridículamente simple. :)

¿Fue útil?

Solución

SMO no recupera metadatos automáticamente si simplemente crea una nueva instancia de la clase Base de datos. La recuperación de metadatos puede llevar un tiempo, especialmente en un ambiente frío. Llame a database.Refresh () antes del bucle.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top