smo的IsSystemObject属性

osm*_*nes 6 c# sql-server smo

我使用SMO从数据库获取存储过程列表.我已经对存储过程进行了循环,以便对它们进行预期的操作.但是我只需要使用用户创建的存储过程.我使用存储过程的IsSystemObject属性.然而它太慢了:

大约10秒:

foreach (StoredProcedure mystr in mydb.StoredProcedures)
{
    if (!mystr.IsSystemObject)
    {
        classGenerated += mystr.Name + Environment.NewLine;
    }
}
Run Code Online (Sandbox Code Playgroud)

不到1秒:

foreach (StoredProcedure mystr in mydb.StoredProcedures)
{    
    classGenerated += mystr.Name + Environment.NewLine;
}
Run Code Online (Sandbox Code Playgroud)

只有一个条件,这种差异是正常的吗?如果没有,这种性能差异的原因是什么?如果有另一种方法,我可以使用另一种方法来区分系统和非系统对象.

Ben*_*hul 11

是的.这就是原因.默认情况下,SMO会预取某些属性,并将其他属性保留为及时.因此,您基本上可以按程序调用,以确定它是否是系统过程.幸运的是,有一个修复.看看这篇BOL文章

SMO优化仅允许在创建对象时加载最小属性.访问未初始化的属性时,SMO会发出单个请求以从SQL Server实例加载信息.您可以使用此方法调整首次创建对象时初始化的属性,以进一步优化性能

  • 是的,它奏效了.我已将VB语法更改为C#.对于其他用户,这里有更好的用法:**myserver.GetDefaultInitFields(typeof(StoredProcedure)); myserver.SetDefaultInitFields(typeof(StoredProcedure),"IsSystemObject");** (3认同)