Текст запроса с помощью подсистемы расширенных событий Microsoft SQL

13.06.13

Разработка - Инструментарий разработчика

В будущем функция sys.fn_trace_gettable будет удалена из Microsoft SQL: http://msdn.microsoft.com/ru-ru/library/ms188425.aspx
Потому предлагаю вашему вниманию способ получения запроса T-SQL с помощью подсистемы расширенных событий

Скачать файлы

Наименование Файл Версия Размер
ЗапросSQL.epf
.epf 52,05Kb
52
.epf 52,05Kb 52 Скачать

При написания обработки использовались:

1. типовая консоль запросов с диска ИТС

2. статьи по подсистеме расширенных событий: http://msdn.microsoft.com/ru-ru/library/bb630282.aspx

 

Некоторые функции по работе с сеансом расширенных событий

Результаты выводятся:

на закладке "Консоль запросов". В нижней части формы имеется панель со следующими страницами:

- "Результат", "Сводная таблица" - вывод результата запроса (функционал типовой консоли)

на закладке "Запрос SQL"

-  "Запрос SQL без псевдонимов" - текст запроса на T-SQL, полученный с помощью подсистемы расширенных событий

- "Запрос SQL с псевдонимами" - в тексте запроса на T-SQL заменены некоторые псевдонимы на "близкие глазу" одинэсника Smile Хотя, есть и более значимые причины для этого. Иногда приходится программисту, пишущему на 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

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122268    673    389    

715

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 15300 руб.

06.10.2023    7323    22    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 8000 руб.

10.11.2023    3567    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177771    1074    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99364    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18128    6    8    

40

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28115    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23605    15    15    

32
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Famza 84 10.06.13 09:21 Сейчас в теме
17. m191 122 14.06.13 13:21 Сейчас в теме
у меня такая же фигня. 1) Ругается на GUID - добавил литерные символы спереди, стал ругаться так:
Сообщение 25706, уровень 16, состояние 8, строка 1
Не удалось обнаружить объект атрибут событий или источник предиката, "sqlserver.database_name".

CREATE
EVENT
SESSION session500b58c2577048aba868a255bd2891e7
ON SERVER
ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1)
WHERE ([sqlserver].[database_name]=N'phis_im')),
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'phis_im'))
ADD TARGET package0.ring_buffer

после вставки
SET QUOTED_IDENTIFIER OFF
НЕ ЗАРАБОТАЛО
18. HEKPOH 76 14.06.13 13:46 Сейчас в теме
(17) проверил в SQL Server Management Studio запрос из поста. Сеанс создается (естественно, имя базы заменил)


Вероятно, не хватает прав :(

У учетки, под которой коннектитесь, права sisadmin есть? Оно включает необходимое право CONTROL SERVER
20. nixel 1404 14.06.13 14:01 Сейчас в теме
(18)
хм. у меня в обозревателе объектов нет ветви "Расширенные события". Это дополнительный компонент и его надо где-то включить?
Ну и в дополнение, на какой версии сервера Вы проверяете? У меня 2008 r2.
21. HEKPOH 76 14.06.13 14:19 Сейчас в теме
(20) у меня 2012, но!

у 2008 R2 с последним сервиспаком должны быть расширенные события
2. sergant500 12.06.13 10:29 Сейчас в теме
Картинка вместо обработки мешает полюбопытчинать тоже
6. HEKPOH 76 13.06.13 11:36 Сейчас в теме
(2)(5) Извините, что-то я напутал с файлами:(
Вечерком залью обработку (с последними изменениями)
3. nixel 1404 12.06.13 11:44 Сейчас в теме
Спасибо за идею, покопаемся.
Под УФ, случаем, нет?
Будет время, попробую впилить в управляемую консоль...
4. HEKPOH 76 12.06.13 14:48 Сейчас в теме
Под УФ нет.
И обработка эта - именно, как идея. Как свободное время появляется, пишу-переписываю-дописываю :).
5. m191 122 13.06.13 09:38 Сейчас в теме
7. HEKPOH 76 13.06.13 18:31 Сейчас в теме
Описание обновил, скрины и обработку перезалил.
Еще раз, прошу прощения
8. nixel 1404 14.06.13 10:37 Сейчас в теме
(7) не получилось покопаться =)
Происходит что-то непонятное при попытке создания сеанса с предложением покурить (строка 907). Сервер доступен, имя базы корректное.

В Соединение.Errors лежит данная табличка на 4 ошибки:
Number	Source	Description	HelpFile	HelpContext	SQLState	NativeError
-2147217900	"Microsoft OLE DB Provider for SQL Server"	"Неправильный синтаксис около конструкции "066"."	""	0	"42000"	102
-2147217900	"Microsoft OLE DB Provider for SQL Server"	"Неправильный синтаксис около конструкции "EVENT"."	""	0	"42000"	102
-2147217900	"Microsoft OLE DB Provider for SQL Server"	"Неправильный синтаксис около конструкции "EVENT"."	""	0	"42000"	102
-2147217900	"Microsoft OLE DB Provider for SQL Server"	"Неправильный синтаксис около конструкции "TARGET"."	""	0	"42000"	102
9. HEKPOH 76 14.06.13 11:46 Сейчас в теме
nixel, привет.
Попробуем разобраться. Проверь по пунктам:
1. Уровень совместимости должен быть как на картинке или выше

2. Проверь, что пишет профайлер
3. Обнови драйвера OLE DB
12. nixel 1404 14.06.13 12:42 Сейчас в теме
(9)
1) Совпадает.
2) Я не силен в администрировании sql-сервера. Можно пошаговую инструкцию или хотя бы где найти профайлер и ссылку на краткую инструкцию по использованию? Предоставлю все, что потребуется =)
3) Обновил. Результат тот же.

Имя базы начинается с буквы, наименование содержит строчные и заглавные латинские буквы и символы _ (подчеркивание)
10. HEKPOH 76 14.06.13 11:54 Сейчас в теме
Да, надеюсь название базы начинается не с цифры?
11. HEKPOH 76 14.06.13 12:39 Сейчас в теме
Может быть, дело в кавычках...

Попробуй в запрос создания сеанса вставить SET QUOTED_IDENTIFIER OFF
http://msdn.microsoft.com/ru-ru/library/ms174393.aspx
13. nixel 1404 14.06.13 12:43 Сейчас в теме
14. nixel 1404 14.06.13 12:53 Сейчас в теме
(11)
не помогло.
Заметил, что в первой строчке с ошибками текст постоянно меняется. Насколько я понял - это часть УИДа сеанса.

Еще иногда (1 раз на 10-15 попыток) вываливается такая ошибка:
Number	Source	Description	HelpFile	HelpContext	SQLState	NativeError
-2147217900	"Microsoft OLE DB Provider for SQL Server"	"Не удалось обнаружить объект атрибут событий или источник предиката, "sqlserver.database_name"."	""	0	"42000"	25 706

но не думаю, что это основная проблема в данном случае.
15. HEKPOH 76 14.06.13 12:57 Сейчас в теме
скопируй сюда (из отладчика) текст запроса (модуль объекта, строка 58)
16. nixel 1404 14.06.13 13:14 Сейчас в теме
(15)
SET QUOTED_IDENTIFIER OFF;

CREATE EVENT SESSION 8851d25ff3cd495da70b65b9f4257279 ON SERVER 
ADD EVENT sqlserver.rpc_completed(SET collect_statement=(1)
	WHERE ([sqlserver].[database_name]=N'grin_TOR_UV')),
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'grin_TOR_UV')) 
ADD TARGET package0.ring_buffer
Показать


что с установкой флага QUOTED_IDENTIFIER, что без - результат и количество ошибок одинаковое.
19. HEKPOH 76 14.06.13 13:55 Сейчас в теме
m191, спасибо за слово "session" :)

nixel, m191, измените, пожл, функцию СоздатьИмяСеанса()
Возврат "ф" + СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
22. nixel 1404 14.06.13 14:34 Сейчас в теме
Вооооот оно что. у меня первый сервис-пак. Что ж, буду трясти админа. спасибо!
23. HEKPOH 76 14.06.13 14:41 Сейчас в теме
(22) оч надеюсь на продолжение диалога по факту "тряски" админа :)
28. nixel 1404 14.06.13 16:42 Сейчас в теме
(23) задача, так сказать, поставлена =)
А там посмотрим. Если разродится, то обязательно напишу о результатах.
24. m191 122 14.06.13 14:59 Сейчас в теме
select @@VERSION
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright © Microsoft Corporation Standard Edition (64-bit) on Windows NT 5.2 <X64> (Build 3790: Service Pack 2)

Расширенных событий нет.
25. HEKPOH 76 14.06.13 15:09 Сейчас в теме
26. nixel 1404 14.06.13 15:40 Сейчас в теме
(24) m191, (25) последний сервис-пак на 2008 скуль - третий, не?
27. HEKPOH 76 14.06.13 15:52 Сейчас в теме
(26) не в курсе. у меня 2008 стоял без расширенных. как про них прочитал, 2012 поставил
Оставьте свое сообщение