У меня есть следующий код:
Using cmd As SqlCommand = Connection.CreateCommand
cmd.CommandText = "UPDATE someTable SET Value = @Value"
cmd.CommandText &= " WHERE Id = @Id"
cmd.Parameters.AddWithValue("@Id", 1234)
cmd.Parameters.AddWithValue("@Value", "myValue")
cmd.ExecuteNonQuery
End Using
Интересно, есть ли какой-нибудь способ получить окончательный SQL-оператор в виде строки, который должен выглядеть следующим образом:
UPDATE someTable SET Value = "myValue" WHERE Id = 1234
Если кто-то задается вопросом, почему я сделал бы это:
- для регистрации (не удалось) операторов
- за возможность скопировать и вставить его в Enterprise Manager для тестирования
Ответы:
Хотя это и не идеально, вот кое-что, что я разработал для TSQL - его можно легко настроить для других вариантов ... Если ничего другого, это даст вам отправную точку для ваших собственных улучшений :)
Это хорошо выполняет работу с типами данных и параметрами вывода и т. Д., Аналогично использованию «выполнить хранимую процедуру» в SSMS. В основном мы использовали SP, поэтому команда text не учитывает параметры и т. Д.
это генерирует вывод по этим направлениям ...
источник
ToBooleanOrDefault
здесь: Вопрос № 3244850Боюсь, что для ведения журналов нет лучшего способа сделать это, кроме как создать строку самостоятельно:
источник
query = Regex.Replace(query, @"\b" + p.ParameterName + @"\b", p.Value.ToString());
для замены параметров в строке. Это заменит «целое слово». Возможно, это не универсальное решение, поскольку \ b помечает позицию между символом слова и символом, отличным от слова, поэтому в случае, если имена ваших параметров начинаются с @, вы должны использоватьp.ParameterName + @"\b"
для замены параметра в строке запроса.Вы не можете, потому что он не генерирует SQL.
Параметризованный запрос (входящий в систему
CommandText
) отправляется на SQL Server как эквивалент подготовленного оператора. При выполнении команды параметры и текст запроса обрабатываются отдельно. В любой момент времени полная строка SQL не генерируется.Вы можете использовать SQL Profiler, чтобы заглянуть за кулисы.
источник
Мне нужна была команда, похожая на строковый преобразователь, для более подробного ведения журнала, поэтому я написал эту. Он выдаст текст, необходимый для повторного выполнения команды в новом сеансе, включая выходные параметры и структурированные параметры. Это слегка проверено, но будьте бдительны.
Пример:
Будет производить:
Реализация:
источник
N
префикс.У меня также была эта проблема, когда некоторые параметризованные запросы или sps давали бы мне SqlException (в основном это были бы усеченные строки или двоичные данные) и операторы, которые трудно отлаживать (насколько я знаю, в настоящее время нет поддержки sql-profiler для SQL Azure)
Я вижу много симуляционного кода в реакциях здесь. В итоге я поместил свое решение в проект библиотеки Sql для будущего использования.
Генератор доступен здесь: https://github.com/jeroenpot/SqlHelper/blob/master/Source/Mirabeau.MsSql.Library/SqlGenerator.cs
Он поддерживает как CommandType.Text, так и CommandType.StoredProcedure.
И если вы установите пакет nuget, вы можете сгенерировать его с помощью следующего оператора:
источник
Если вы используете SQL Server, вы можете использовать SQL Server Profiler (если он у вас есть) для просмотра фактически выполненной командной строки. Это было бы полезно для копирования копий / вставок, но не для регистрации.
источник
Поздний ответ, я знаю, но я тоже хотел это, чтобы я мог войти в SQL. Следующее короткое и отвечает моим потребностям.
Следующее создает SQL, который вы можете копировать / вставлять в SSMS (он заменяет параметры на значения правильно). Вы можете добавить больше типов, но это соответствует всем, что я использую в этом случае.
Теперь я могу записать SQL перед тем, как выполнить его:
источник
Профилировщик - ваш лучший вариант.
Вам может потребоваться скопировать набор операторов из профилировщика из-за включенных шагов подготовить + выполнить.
источник
У меня был такой же точный вопрос, и после прочтения этих ответов по ошибке решил, что невозможно получить точный результирующий запрос. Я ошибался.
Решение: Откройте
Activity Monitor
вSQL Server Management Studio
, сужает раздел процессов в авторизации пользователя, базы данных или имя приложения, приложение использует в строке подключения. Когда вызов сделан на обновление базы данныхActivity Monitor
. Когда вы увидите процесс, щелкните по нему правой кнопкой мыши иView Details
.Обратите внимание, что это не может быть приемлемым вариантом для занятых БД. Но вы должны быть в состоянии значительно сузить результат, используя эти шаги.
источник
Для моего решения использовалась часть кода Flapper , которая возвращает всю строку SQL, включая значения параметров, для запуска в MS SQL SMS.
источник
Мое решение:
источник
Я написал этот метод для меня. Я использую некоторую часть кода Бруно Ратниекса . Может быть, это кому-то пригодится.
источник
Если только проверить, как параметр отформатирован в результате запроса, большинство СУБД позволит запрашивать литералы из ничего. Таким образом:
Таким образом, вы можете увидеть, если кавычки удвоены и т. Д.
источник
Это то, что я использую для вывода списков параметров для хранимой процедуры в консоль отладки:
Это сгенерирует выходной файл консоли:
Я размещаю этот код непосредственно под любой процедурой, которую я хочу отладить, и похож на сеанс SQL Server Profiler, но в C #.
источник
Модифицированная версия ответа Кона, поскольку она только частично работает с аналогичными именованными параметрами. Недостаток использования функции String Replace. Кроме этого, я отдаю ему должное за решение.
источник
Это решение работает для меня прямо сейчас. Может быть, это кому-то полезно. Пожалуйста, извините за все избыточность.
источник
Как упоминали @pkExec и @Alok, использование Replace не работает в 100% случаев. Это решение, которое я использовал в нашем DAL, которое использует RegExp только для «соответствия целому слову» и правильного форматирования типов данных. Таким образом, сгенерированный SQL может быть протестирован непосредственно в MySQL Workbench (или SQLSMS и т. Д.) :)
(Замените функцию MySQLHelper.EscapeString () в соответствии с используемой СУБД.)
Пример:
Будет сгенерировано:
источник
запросы команды sql будут выполняться с помощью exec sp_executesql, так что вот еще один способ получить инструкцию в виде строки (метод расширения SqlCommand):
источник
Мне нужно было охватить и не хранимые процедуры, поэтому я добавил библиотеку CommandAsSql (см. комментарии к ответу @ Flapper выше) с помощью этой логики:
запрос на получение по адресу: https://github.com/jphellemons/CommandAsSql/pull/3/commits/527d696dc6055c5bcf858b9700b83dc863f04896
Идея Regex была основана на комментариях @ stambikk и EvZ выше и в разделе «Обновление:» на https://stackoverflow.com/a/2544661/903783, в котором упоминается «отрицательное утверждение с обратной связью ». Использование \ B вместо \ b для обнаружения границы слова в начале регулярного выражения объясняется тем, что p.parameterName всегда будет начинаться с «@», который не является символом слова.
обратите внимание, что ParameterValueForSQL () - это метод расширения, определенный в библиотеке CommandAsSql, для обработки таких проблем, как значения строковых параметров в одинарных кавычках и т. д.
источник
Если вы будете конвертировать командный текст:
Теперь вы можете получить командный текст без параметров следующим образом:
и результатом будет «UPDATE someTable SET Value = 'myValue' WHERE Id = 1234" без параметра больше
источник
Расширенный код Кона для отладки хранимой процедуры:
В моем первом тестовом примере он сгенерировал:
Возможно, вам потребуется добавить еще несколько условных присваиваний типа "..is ...", например, для дат и времени.
источник
Один лайнер:
источник
От команды параметра к команде без параметра, Вы можете изменить это
к
источник