Я работаю над структурой мутационных тестов для SQL Server, для этого мне нужно иметь возможность вычислять, какие строки хранимой процедуры, функции или триггера выполняются при выполнении определенной хранимой процедуры.
Сложность в том, что я хочу знать точные строки или операторы, выполняемые из хранимой процедуры, которую я вызываю.
С помощью такого запроса я могу видеть, какие хранимые процедуры / триггеры / функции выполняются, так как язнаю, когда я вызываю хранимую процедуру, я могу использовать время, чтобы увидеть, была ли она выполнена.
SELECT d.object_id, d.database_id,
OBJECT_NAME(object_id, database_id) AS proc_name,
MAX( d.last_execution_time) as last_execution_time,
OBJECT_DEFINITION(object_id) as definition
FROM sys.dm_exec_procedure_stats AS d
WHERE d.database_id = DB_ID()
GROUP BY d.object_id, d.database_id,
OBJECT_NAME(object_id, database_id)
Как мне найти строки / операторы, которые были выполнены, я также должен знать внутри какой хранимой процедуры/ trigger / function строки / операторы существуют и в какой это форме.Я должен учитывать, что можно использовать оператор IF / ELSE.
С этими данными я могу сделать 2 важные вещи:
- создать отчет о покрытии кода
- Оптимизировать, какие строки нужно изменить, поскольку мне не нужно мутировать непокрытые строки.
Возможно, но не очень хорошее решение - автоматически изменить хранимые процедуры, добавив строку, которая вставляетпредыдущую строку в таблицу, но для этого потребуется разделить процедуру на операторы, что я не знаю, как это сделать.
Обратите внимание, что я не могу изменить код, который пользователи хотят тестировать с моей платформой.Я могу искать шаблоны и заменять их, но ручное изменение процедур НЕ является опцией.
РЕДАКТИРОВАТЬ: позволяет переформулировать этот вопрос: как разделить определение хранимой процедуры на различные операторы таким образом, чтобы это не зависело от стиля кода?и Как добавить новый оператор между найденными операторами?
РЕДАКТИРОВАТЬ: в сообщении SO SQL Server: Как разобрать код в его различные операторы Я нашел способ отследить выполнение операторов, но я пока не могу его отфильтровать.