2009-03-05 7 views
4

Ich fühle mich wie ein Depp nur um das zu fragen, aber ich bekomme keine Hilfe von Google, und ich blätterte alle Ergebnisse von SO auf einer einfachen Suche nach SMO und sah es auch nicht .SQL SMO Tabellen nicht aufzählen

Die kurze Version ist, dass ich anfange, mit T4 zu spielen. Ich expandiere auf Oleg Sych's initial tutorial, um Aufzählung über alle Tabellen bereitzustellen, um einen (IMHO eher albernen) Löschvorgang zu erstellen. Das ist nur ein Experiment, also stört mich seine völlige Nutzlosigkeit nicht. :)

Meine Expansion Oleg Tutorial wie folgt aussieht:

<#@ 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 den von mir erzeugten Tabellenzählungs-SQL-Kommentar bestätigt, der 0 ausgibt.

Wie geschrieben, oberhalb der Code generiert die folgende:

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 es das (wieder dumme) proc - Für diesen Tisch.

Die Tabellen sind in ein Schema unterteilt, wäre das wichtig? Außerdem läuft dies gegen eine SQL2005-Instanz - würde das möglicherweise Probleme verursachen?

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

Noch einmal, um zu wiederholen, der obige Code ist natürlich keine Produktion, noch nicht einmal die Produktion wert. Ich versuche nur, sowohl T4 als auch SMO zu lernen und einen Roadblock zu treffen, der versucht, etwas zu tun, von dem ich dachte, dass es lächerlich einfach wäre. :)

Antwort

8

SMO ruft Metadaten nicht automatisch ab, wenn Sie einfach eine neue Instanz der Database-Klasse erstellen. Das Abrufen von Metadaten kann eine Weile dauern, besonders in einer kalten Umgebung. Rufen Sie Datenbank.Refresh() vor der Schleife auf.

+0

Danke für den Hinweis! Ich bin sicher, es wird funktionieren, aber ich bin mir sicher und update (und akzeptiere das), wenn es nicht ist! –

+0

Sie rocken. Absolut wie ein Charme gearbeitet. Danke noch einmal! –