Как можно более эффективно получать параметры хранимых процедур SQL с помощью SMO? - PullRequest
4 голосов
/ 16 декабря 2011

Я пытаюсь получить DefaultValue всех параметров в StoredProcedure. Мое приложение построено на 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 ]

2 голосов
/ 02 апреля 2012

У меня была странная проблема, и я обнаружил, что если вы используете ...

svr.SetDefaultInitFields(typeof(StoredProcedure), false)

Это способ быстрее.Я предполагаю, что с любыми другими опциями он на самом деле получает все, но если вы выключите его, то просто получите свои параметры, увеличение скорости огромно.Мой, когда от 5-6 секунд до 0,5 секунд в течение 10 парам.Все еще не совсем идеальный, но пригодный для использования.

РЕДАКТИРОВАТЬ

Так как я поиграл с этим немного больше, я обнаружил, что аппрох уровня typeof(StoredProcedure) работает лучше всего.В моих тестах с использованием опции typeof(StoreedProcedureParameter) было примерно 1,5 с или около того по сравнению с 0,5 с или около того с версией typeof(StoredProcedure).

Мне было бы интересно, если кто-нибудь может сказать мне, почему?

0 голосов
/ 20 декабря 2011

Вы можете использовать анализатор для извлечения значений по умолчанию из хранимой процедуры, например, Microsoft.Data.Schema.ScriptDom.

...