C# SQL SMO未枚举表

C# SQL SMO未枚举表,c#,t4,sql-smo,C#,T4,Sql Smo,仅仅问这个问题我就觉得自己像个傻瓜,但我没有从谷歌那里得到任何帮助,我在一个简单的SMO搜索中浏览了SO的所有结果,也没有看到 简短的版本是,我开始玩T4。我将继续扩展以提供对所有表的枚举,以创建(IMHO相当愚蠢的)delete proc。这只是一个实验,所以它毫无用处,我并不担心 我对Oleg教程的扩展如下所示: <#@ template language="C#" hostspecific="true" #> <#@ output extension="SQL" #>

仅仅问这个问题我就觉得自己像个傻瓜,但我没有从谷歌那里得到任何帮助,我在一个简单的SMO搜索中浏览了SO的所有结果,也没有看到

简短的版本是,我开始玩T4。我将继续扩展以提供对所有表的枚举,以创建(IMHO相当愚蠢的)delete proc。这只是一个实验,所以它毫无用处,我并不担心

我对Oleg教程的扩展如下所示:

<#@ 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");
    }
#> 
但是,如果我删除for循环并手动提供此数据库中存在的有效表名,它将为该表生成(同样愚蠢的)proc

这些表被分成一个模式,这有关系吗?另外,这是针对SQL2005实例的——这可能会导致问题吗

最后,我还发现我无法通过同义词集合枚举同义词。(我认为我应该聪明地走这条路,因为表在模式中,但定义了同义词。但是……没有骰子。)


再次重申,上面的代码自然不适合生产,甚至不适合生产。我只是想学习T4和SMO,但在尝试做一些我认为简单得可笑的事情时遇到了障碍

如果只是创建数据库类的新实例,SMO不会自动检索元数据。检索元数据可能需要一段时间,尤其是在寒冷的环境中。在循环之前调用database.Refresh()

谢谢你的建议!我肯定它会工作,但我会确定,并更新(并接受这个),如果它不!你救了我的命。谢谢
USE dbname
/* Number of tables: 0 */