2009-03-05 31 views
4

我覺得自己只是一個問題,但我沒有得到谷歌的任何幫助,而且我通過簡單搜索SMO來分析所有SO的結果,但沒有看到它。SQL SMO沒有列舉表格

短版本是我開始玩T4。我正在擴大Oleg Sych's initial tutorial以提供對所有表的枚舉以創建(恕我直言,而非愚蠢的)刪除過程。這只是一個實驗,所以它完全無用並不會打擾我。 :)

我對奧列格的教程擴張看起來是這樣的:

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

的問題是,沒有表從Tables集合返回。這由我生成的表計數SQL註釋驗證,其輸出0

作爲寫入,上面的代碼生成以下內容:

USE dbname 
/* Number of tables: 0 */ 

然而,如果刪除for循環和手動提供存在於該數據庫中的有效的表名,它生成的(再次傻)PROC - 那張桌子。

這些表被分成一個模式,這是否重要?此外,這是針對SQL2005實例 - 這可能會導致問題?

最後,我還發現我無法通過Synonyms集合列舉同義詞。 (我認爲我會很聰明,因爲這些表是在一個模式中,但是有同義詞定義,但是沒有骰子)

再次重申,上述代碼自然不是生產,甚至不值得生產。我只是想學習T4和SMO,並試圖做一些我認爲會很簡單的事情。 :)

回答

8

如果您只是創建一個新的Database類實例,SMO不會自動檢索元數據。檢索元數據可能需要一段時間,特別是在寒冷的環境中。在循環之前調用database.Refresh()。

+0

感謝您的建議!我確信它會起作用,但如果它不行,我會確定並更新(並接受此)! – 2009-03-06 12:09:25