我目前正在使用SMO和C#来遍历数据库以创建表示两个数据库各个方面的设置树,然后比较这些树以查看它们在何处以及如何不同。
问题是,对于2个大小合理的数据库,在本地抓取它们需要差不多10分钟,并收集我希望比较的表/列/存储过程信息。
SMO是否有更好的接口以这种方式访问数据库?我想不包括任何其他依赖项,但我会把这种痛苦提高50%的速度。下面是我如何枚举表和列的示例。
Microsoft.SqlServer.Management.Smo.Database db = db_in;
foreach (Table t in db.Tables)
{
if (t.IsSystemObject == false)
{
foreach (Column c in t.Columns)
{
}
}
}
答案 0 :(得分:6)
尝试强制SMO一次读取所有必填字段,而不是查询访问权限。 有关详细信息,请参阅this blog
Server server = new Server();
// Force IsSystemObject to be returned by default.
server.SetDefaultInitFields(typeof(StoredProcedure), "IsSystemObject");
StoredProcedureCollection storedProcedures = server.Databases["AdventureWorks"].StoredProcedures;
foreach (StoredProcedure sp in storedProcedures) {
if (!sp.IsSystemObject) {
// We only want user stored procedures
}
}
答案 1 :(得分:2)
使用每个数据库中的系统视图并按常规查询。
答案 2 :(得分:0)
您无法通过TSQL查询获得。以这种方式获取元数据通常非常快。