Получить сгенерированный SQL-оператор от объекта SqlCommand?

177
задан dakab 24 May 2016 в 07:33
поделиться

5 ответов

Профилировщик является руками вниз Ваш наилучший вариант.

Вы, возможно, должны были бы скопировать ряд операторов от профилировщика из-за того, чтобы готовить +, выполняют включенные шаги.

2
ответ дан Ed Guiness 23 November 2019 в 20:19
поделиться

При использовании SQL Server Вы могли бы использовать SQL Server Profiler (если у Вас есть он) просмотреть командную строку, которая на самом деле выполняется. Это было бы полезно для того, чтобы скопировать/вставить протестировать purpuses, но не для входа, я боюсь.

5
ответ дан Rockcoder 23 November 2019 в 20:19
поделиться

Вы не можете, потому что это не генерирует SQL.

параметризированный запрос (тот в CommandText) отправляется в SQL Server как эквивалент подготовленного оператора. При выполнении команды параметры и текст запроса рассматривают отдельно. Ни в каком смысле вовремя сгенерирована полная строка SQL.

можно использовать SQL Profiler для взгляда негласно.

46
ответ дан Tomalak 23 November 2019 в 20:19
поделиться

Для входа целей я боюсь, что нет никакого более хорошего способа сделать это, но создать строку самостоятельно:

string query = cmd.CommandText;

foreach (SqlParameter p in cmd.Parameters)
{
    query = query.Replace(p.ParameterName, p.Value.ToString());
}
117
ответ дан user3071284 23 November 2019 в 20:19
поделиться

Расширенный код Kon , чтобы помочь отладить хранимую процедуру:

    private void ExtractSqlCommandForDebugging(SqlCommand cmd)
    {
        string sql = "exec " + cmd.CommandText;
        bool first = true;
        foreach (SqlParameter p in cmd.Parameters)
        {
            string value = ((p.Value == DBNull.Value) ? "null"
                            : (p.Value is string) ? "'" + p.Value + "'"
                            : p.Value.ToString());
            if (first)
            {
                sql += string.Format(" {0}={1}", p.ParameterName, value);
                first = false;
            }
            else
            {
                sql += string.Format("\n , {0}={1}", p.ParameterName, value);
            }
        }
        sql += "\nGO";
        Debug.WriteLine(sql);
    }

В моем первом тестовом сценарии, это генерировало:

exec dbo.MyStoredProcName @SnailMail=False
 , @Email=True
 , @AcceptSnailMail=False
 , @AcceptEmail=False
 , @DistanceMiles=-1
 , @DistanceLocationList=''
 , @ExcludeDissatisfied=True
 , @ExcludeCodeRed=True
 , @MinAge=null
 , @MaxAge=18
 , @GenderTypeID=-1
 , @NewThisYear=-1
 , @RegisteredThisYear=-1
 , @FormersTermGroupList=''
 , @RegistrationStartDate=null
 , @RegistrationEndDate=null
 , @DivisionList='25'
 , @LocationList='29,30'
 , @OneOnOneOPL=-1
 , @JumpStart=-1
 , @SmallGroup=-1
 , @PurchasedEAP=-1
 , @RedeemedEAP=-1
 , @ReturnPlanYes=False
 , @MinNetPromoter=-1
 , @MinSurveyScore=-1
 , @VIPExclusionTypes='-2'
 , @FieldSelectionMask=65011584
 , @DisplayType=0
GO

необходимо будет, вероятно, добавить еще некоторое условное выражение "....." присвоения типа, например, для дат и времени.

0
ответ дан 23 November 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: