Question

Je me sens comme un idiot juste pour demander cela, mais je ne reçois aucune aide de Google, et j'ai parcouru tous les résultats de SO sur une simple recherche de SMO et je ne l'ai pas vue non plus.

La version courte est que je commence à jouer avec T4. J'étends le premier tutoriel d'Oleg Sych pour fournir une énumération sur toutes les tables afin de créer un proc (à mon humble avis plutôt ridicule) delete. Ceci est juste une expérience, donc son inutilité absolue ne me dérange pas. :)

Mon extension au tutoriel d'Oleg ressemble à ceci:

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

Le problème est qu'aucune table n'est renvoyée de la collection Tables . Ceci est validé par le nombre de tables SQL que je génère et qui génère 0 .

Tel qu'écrit, le code ci-dessus génère les éléments suivants:

USE dbname
/* Number of tables: 0 */

Cependant, si je supprime la boucle for et donne manuellement un nom de table valide qui existe dans cette base de données, il génère le proc (encore idiot) - pour cette table.

Les tables sont séparées en un schéma, est-ce important? En outre, cela va à l’encontre d’une instance SQL2005 - est-ce que cela poserait potentiellement des problèmes?

Enfin, je constate également que je ne peux pas énumérer les synonymes via la collection Synonymes. (Je pensais que je serais intelligent et que je suivrais cette voie, car les tables sont dans un schéma, mais ont des synonymes définis. Mais ... pas de dés.)

Encore une fois, pour réitérer, le code ci-dessus n’est naturellement pas productif, ni même productif. J'essaie simplement d'apprendre à la fois le T4 et le SMO, et je suis tombé sur un obstacle en essayant de faire quelque chose qui, à mon avis, serait ridiculement simple. :)

Était-ce utile?

La solution

SMO ne récupère pas automatiquement les métadonnées si vous créez simplement une nouvelle instance de la classe Database. La récupération des métadonnées peut prendre un certain temps, en particulier dans un environnement froid. Appelez database.Refresh () avant la boucle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top