我觉得这只是一个傻瓜只是为了问这个问题,但是我没有得到谷歌的任何帮助,我通过简单搜索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实例 - 这可能会导致问题吗?
最后,我还发现我无法通过Synonyms集合枚举同义词。 (我以为我会很聪明并且走这条路线,因为这些表是在一个模式中,但是已经定义了同义词。但是......没有骰子。)
同样,重申一下,上面的代码自然不是生产,甚至生产也不值得。我只是想学习T4和SMO,并试图做一些我认为会非常简单的事情。 :)
答案 0 :(得分:13)
如果您只是创建Database类的新实例,则SMO不会自动检索元数据。检索元数据可能需要一段时间,尤其是在寒冷的环境中。在循环之前调用database.Refresh()。