我只是想问这个问题而感到傻瓜,但是我没有从Google那里得到任何帮助,我在一次简单的SMO搜索中浏览了SO的所有结果,也没有看到。

简短的版本是我开始玩T4。我正在扩展Oleg Sych's initial tutorial来提供所有表的枚举,以创建一个(恕我直言,相当愚蠢的)删除过程。这只是一个实验,所以它完全没用,不会打扰我。 :)

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

问题是Tables集合没有返回任何表。这由我生成的表计数SQL注释验证,该注释输出0

按照上面的代码,上面的代码生成以下内容:
USE dbname
/* Number of tables: 0 */

但是,如果我删除了for循环并手动提供此数据库中存在的有效表名,它将为该表生成(再次愚蠢的)proc。

这些表被分成一个模式,这有关系吗?此外,这与SQL2005实例相抵触-会潜在地引起问题吗?

最后,我还发现我无法通过“同义词”集合枚举同义词。 (我认为我会很聪明,因为表在模式中,但是已经定义了同义词,所以走那条路。但是……没有骰子。)

再次重申,以上代码自然不是生产,甚至也不值得生产。我只是想同时学习T4和SMO,遇到障碍,试图做一些我认为非常简单的事情。 :)

最佳答案

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

关于c# - SQL SMO不枚举表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/616717/

10-13 08:12