我目前正在使用 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)
                {
                }                    
            }
        }
有帮助吗?

解决方案

尝试强制 SMO 一次读取所有必填字段,而不是在访问时查询。看 这个博客 了解更多信息


编辑:链接已失效,但我找到了 这一页 在 archive.org 上。这是相关代码:

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
    }
}

其他提示

几乎没有什么是您无法通过 TSQL 查询获得的。以这种方式获取元数据通常非常快。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top