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.
declare @table_creation_script varchar(max);
exec sp_whoisactive @Schema = @table_creation_script output, @return_schema=1;
print @table_creation_script;
Procedura ta wygeneruje skrypt tworzący tabelę:
CREATE TABLE <table_name>
(
[dd hh:mm:ss.mss] varchar(8000) NULL,
[session_id] smallint NOT NULL,
[sql_text] xml NULL,
[login_name] nvarchar(128) NOT NULL,
[wait_info] nvarchar(4000) NULL,
[CPU] varchar(30) NULL,
[tempdb_allocations] varchar(30) NULL,
[tempdb_current] varchar(30) NULL,
[blocking_session_id] smallint NULL,
[reads] varchar(30) NULL,
[writes] varchar(30) NULL,
[physical_reads] varchar(30) NULL,
[used_memory] varchar(30) NULL,
[status] varchar(30) NOT NULL,
[open_tran_count] varchar(30) NULL,
[percent_complete] varchar(30) NULL,
[host_name] nvarchar(128) NULL,
[database_name] nvarchar(128) NULL,
[program_name] nvarchar(128) NULL,
[start_time] datetime NOT NULL,
[login_time] datetime NULL,
[request_id] int NULL,
[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.
-- generate a script to create a table that can save sp_whoisactive result
declare @table_creation_script varchar(max);
exec sp_whoisactive @get_outer_command=1
, @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]'
, @find_block_leaders=1
, @Schema = @table_creation_script output, @return_schema=1;
print @table_creation_script;
Dane zapisuje się do tabeli używając skryptu:
exec sp_whoisactive @get_outer_command=1
, @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]'
, @find_block_leaders=1
, @destination_table = 'dbo.<table_name>';