我觉得这只是一个傻瓜只是为了问这个,但我没有得到谷歌的任何帮助,我通过简单搜索SMO来浏览所有SO的结果,但也没有看到它.
简短的版本是我开始玩T4.我正在扩展Oleg Sych的初始教程,提供所有表的枚举,以创建一个(恕我直言,相当愚蠢)删除过程.这只是一个实验,所以它完全没用并不会打扰我.:)
我对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,并试图做一些我认为会非常简单的事情.:)
如果只是创建Database类的新实例,SMO不会自动检索元数据.检索元数据可能需要一段时间,尤其是在寒冷的环境中.在循环之前调用database.Refresh().