Jeśli zachodzi potrzeba gromadzenia danych generowanych przez procedurę sp_whoisactive w celu dalszej analizy należy je zapisać do tabeli. W tym celu najpierw trzeba utworzyć tabelę o odpowiedniej strukturze.
Jak to zrobić ?
Z pomocą przychodzi sama procedura.
Następujące polecenie wygeneruje kod potrzebny do utworzenia tabeli potrzebnej do przechowywania danych.
1 | declare @table_creation_script varchar ( max ); |
2 | exec sp_whoisactive @ Schema = @table_creation_script output , @return_schema=1; |
3 | print @table_creation_script; |
Procedura ta wygeneruje skrypt tworzący tabelę:
01 | CREATE TABLE <table_name> |
03 | [dd hh:mm:ss.mss] varchar (8000) NULL , |
04 | [session_id] smallint NOT NULL , |
06 | [login_name] nvarchar(128) NOT NULL , |
07 | [wait_info] nvarchar(4000) NULL , |
08 | [CPU] varchar (30) NULL , |
09 | [tempdb_allocations] varchar (30) NULL , |
10 | [tempdb_current] varchar (30) NULL , |
11 | [blocking_session_id] smallint NULL , |
12 | [reads] varchar (30) NULL , |
13 | [writes] varchar (30) NULL , |
14 | [physical_reads] varchar (30) NULL , |
15 | [used_memory] varchar (30) NULL , |
16 | [status] varchar (30) NOT NULL , |
17 | [open_tran_count] varchar (30) NULL , |
18 | [percent_complete] varchar (30) NULL , |
19 | [host_name] nvarchar(128) NULL , |
20 | [database_name] nvarchar(128) NULL , |
21 | [program_name] nvarchar(128) NULL , |
22 | [start_time] datetime NOT NULL , |
23 | [login_time] datetime NULL , |
24 | [request_id] int NULL , |
25 | [collection_time] datetime NOT NULL |
Wszystko, co teraz trzeba zrobić, to zastąpić ciąg „<table_name >” wybraną prawdziwą nazwą tabeli.
Należy zwrócić uwagę, że skrypt tworzący tabelę zawiera wiele kolumn, które są kolumnami domyślnymi po uruchomieniu sp_whoisactive bez żadnych parametrów – niekoniecznie potrzebne są wszystkie informacje. Z drugiej strony domyślna lista może nie zawierać tego, czego się oczekuje, na przykład może nie potrzebne są dla danego rozwiązania kolumny [request_id] lub [open_tran_count], ale za to potrzebne są kolumny, które mogą powiedzieć, która sesja jest na czele łańcucha blokowania w scenariusz blokowania wielu sesji.
Tak więc można zdefiniować listę kolumn, która jest we danym rozwiązaniu potrzebna, a następnie wygenerować ponownie skrypt tworzenia tabeli.
2 | declare @table_creation_script varchar ( max ); |
3 | exec sp_whoisactive @get_outer_command=1 |
4 | , @output_column_list = '[dd%][session_id][sql_command][sql_text][login_name][host_name][database_name][wait_info][blocking_session_id][blocked_session_count][percent_complete][cpu][used_memory][reads][writes][program_name][collection_time]' |
6 | , @ Schema = @table_creation_script output , @return_schema=1; |
7 | print @table_creation_script; |
Dane zapisuje się do tabeli używając skryptu:
1 | exec sp_whoisactive @get_outer_command=1 |
2 | , @output_column_list = '[dd%][session_id][sql_command][sql_text][login_name][host_name][database_name][wait_info][blocking_session_id][blocked_session_count][percent_complete][cpu][used_memory][reads][writes][program_name][collection_time]' |
4 | , @destination_table = 'dbo.<table_name>' ; |