При написания обработки использовались:
1. типовая консоль запросов с диска ИТС
2. статьи по подсистеме расширенных событий: http://msdn.microsoft.com/ru-ru/library/bb630282.aspx
Некоторые функции по работе с сеансом расширенных событий
Результаты выводятся:
на закладке "Консоль запросов". В нижней части формы имеется панель со следующими страницами:
- "Результат", "Сводная таблица" - вывод результата запроса (функционал типовой консоли)
на закладке "Запрос SQL"
- "Запрос SQL без псевдонимов" - текст запроса на T-SQL, полученный с помощью подсистемы расширенных событий
- "Запрос SQL с псевдонимами" - в тексте запроса на T-SQL заменены некоторые псевдонимы на "близкие глазу" одинэсника Хотя, есть и более значимые причины для этого. Иногда приходится программисту, пишущему на T-SQL, показывать запросы из 1С, преобразованные в T-SQL. Увы, псевдонимы теряются.
- "Результат SQL без псевдонимов", "Результат SQL с псевдонимами" - в разработке (выполнение SQL запроса из 1С и вывод результата в 1С без необходимости использовать SQL Server Management Studio - в разработке)
- "Кольцевой буфер" - информационная страница, показывающая данные, собранные сеансом расширенных событий (с учетом ограничений, с которыми сеанс был создан).
Обработка вполне функциональная (хотя еще дописывается), в связи с чем хочу сразу предупредить о некоторых минусах:
1. не полностью переводятся в T-SQL пакетные запросы (в будущем будут)
2. изменяются только некоторые псевдонимы (основное направление развития - именно псевдонимы)
3. перед преобразованием запроса (нажатием на кнопку "SQL") текст запроса на 1С должен быть ОБЯЗАТЕЛЬНО отформатирован с помощью конструктора запроса
Некотрые использованные механизмы:
1. регулярные выражения
2. внедрение "маркера" в текст запроса 1С
Некоторые алгоритмы работы с сеансами расширенных событий:
Подготовка текстов SQL запросов:
Функция СоздатьИмяСеанса() Экспорт
Возврат СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
КонецФункции
// http://msdn.microsoft.com/ru-ru/library/bb677289%28v=sql.100%29.aspx
Функция Текст_СозданиеСеанса() Экспорт
Текст =
"CREATE EVENT SESSION ИмяСеанса ON SERVER
|ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1)
| WHERE ([sqlserver].[database_name]=N'ИмяБД')),
|ADD EVENT sqlserver.sql_statement_starting(SET collect_statement=(1)
| ACTION(package0.callstack,sqlserver.client_app_name,sqlserver.client_connection_id,sqlserver.client_hostname,sqlserver.client_pid)
| WHERE ([sqlserver].[database_name]=N'ИмяБД'))
|ADD TARGET package0.ring_buffer";
Текст = СтрЗаменить(Текст, "ИмяСеанса", ИмяСеанса);
Текст = СтрЗаменить(Текст, "ИмяБД", ИмяБД);
Возврат Текст;
КонецФункции
// http://msdn.microsoft.com/ru-ru/library/bb630257%28v=sql.100%29.aspx
Функция Текст_УдалениеСеанса() Экспорт
Возврат "DROP EVENT SESSION " + ИмяСеанса + " ON SERVER";
КонецФункции
// http://msdn.microsoft.com/ru-ru/library/bb630368%28v=sql.100%29.aspx
Функция Текст_ЗапускСеанса() Экспорт
Возврат "ALTER EVENT SESSION " + ИмяСеанса + " ON SERVER STATE = START";
КонецФункции
Функция Текст_ОстановкаСеанса() Экспорт
Возврат "ALTER EVENT SESSION " + ИмяСеанса + " ON SERVER STATE = STOP";
КонецФункции
// http://msdn.microsoft.com/ru-ru/library/ff878182.aspx
Функция Текст_ПросмотрЦелевогоВывода() Экспорт
Текст =
"SELECT --*** данный запрос получает текст кольцевого буфера ***--
| name,
| target_name,
| CAST(xet.target_data AS xml) AS Данные
|FROM
| sys.dm_xe_session_targets AS xet
|JOIN sys.dm_xe_sessions AS xe ON (xe.address = xet.event_session_address)
|WHERE
| xe.name = 'ИмяСеанса'";
Возврат СтрЗаменить(Текст, "ИмяСеанса", ИмяСеанса);
КонецФункции
Пример вызова функции:
//удалим созданный сеанс
Если УдалятьСеанс Тогда
УдалениеСеанса = Текст_УдалениеСеанса();
Попытка
ADOТаблица = Соединение.Execute(УдалениеСеанса);
Исключение
Сообщить("Не получилось удалить сеанс" + ИмяСеанса, СтатусСообщения.Важное);
Возврат;
КонецПопытки;
Иначе
//остановим сеанс (на всякий случай)
ОстановкаСеанса = Текст_ОстановкаСеанса();
Попытка
ADOТаблица = Соединение.Execute(ОстановкаСеанса);
Исключение
Сообщить("Не получилось остановить сеанс " + ИмяСеанса, СтатусСообщения.Важное);
Возврат;
КонецПопытки;
КонецЕсли;
Полученные тексты запросов (с псевдонимами и без) протестированы в среде SQL Server Management Studio