如何更有效地使用SMO检索SQL存储过程参数?

时间:2011-12-16 00:31:56

标签: sql-server performance smo

我正在尝试检索StoredProcedure中所有参数的DefaultValue。我的应用程序是在C#.NET中构建的,访问Microsoft SQL 2008数据库。

我使用SqlCommandBuilder.DeriveParameters相当有效地获取大部分参数信息,但它不返回参数的“DefaultValue”,因此我使用SMO来获取该特定属性。

这是我目前的代码:

        Server svr = new Server(new ServerConnection(new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString)));
        StoredProcedure sp = svr.Databases["MyDatabase"].StoredProcedures["mySproc", "myScheme"];
        svr.SetDefaultInitFields(typeof(StoredProcedureParameter), "Name");
        svr.SetDefaultInitFields(typeof(StoredProcedureParameter), "DefaultValue");

        Dictionary<string, string> defaultValueLookup = new Dictionary<string, string>();
        foreach (StoredProcedureParameter parameter in sp.Parameters)
        {
            string defaultValue = parameter.DefaultValue;
            string parameterName = parameter.Name;
            defaultValueLookup.Add(parameterName, defaultValue);
        }

然而,即使我添加了svr.SetDefaultInitFields优化(这确实显着改善了~10倍的改进),这也非常慢。

有人有进一步的优化想法吗?

2 个答案:

答案 0 :(得分:2)

我有一个熟悉的问题,发现如果你使用......

svr.SetDefaultInitFields(typeof(StoredProcedure), false)

方式更快。我认为,除了任何其他选项,它实际上取得了所有东西,但是如果你关闭它,那么只要获得你的参数,速度的提升是巨大的。对于10个参数,从5-6秒到0.5秒进行挖掘。仍然不是很完美但适合居住。

修改

自从玩这个以后,我发现typeof(StoredProcedure)级别的appraoch效果最好。在我的测试中,使用typeof(StoreedProcedureParameter)选项始终为1.5秒左右,而typeof(StoredProcedure)版本为0.5秒左右。

如果有人能告诉我原因,我会感兴趣吗?

答案 1 :(得分:0)

您可以使用解析器从存储过程中检索默认值,例如Microsoft.Data.Schema.ScriptDom