sp_who (Transact-SQL)
Область применения: SQL Server
Предоставляет сведения о текущих пользователях, сеансах и процессах в экземпляре SQL Server ядро СУБД. Данные можно отфильтровать, чтобы возвращать только те процессы, которые не являются бездействующими, принадлежащими конкретному пользователю или принадлежащим определенному сеансу.
Соглашения о синтаксисе Transact-SQL
Синтаксис
sp_who [ [ @loginame = ] { 'login' | *session_id* | 'ACTIVE' } ]
[ ; ]
Аргументы
[ @loginame = ] { 'login' | session_id | 'ACTIVE' }
Используется для фильтрации результирующий набор.
имя входа — это имя sysname , определяющее процессы, принадлежащие определенному имени входа.
session_id — это идентификационный номер сеанса, принадлежащий экземпляру SQL Server. session_id имеет небольшой размер.
ACTIVE
исключает сеансы, ожидающие следующей команды от пользователя.
Если значение не указано, эта процедура возвращает все сеансы, принадлежащие экземпляру.
Значения кода возврата
0
(успешно) или 1
(сбой).
Результирующий набор
sp_who
возвращает результирующий набор со следующими сведениями.
Column | Тип данных | Description |
---|---|---|
spid |
smallint | ИД сеанса. |
ecid |
smallint | Идентификатор контекста выполнения заданного потока, связанный с определенным идентификатором сеанса. ECID = { 0, 1, 2, 3, ...n }, где 0 всегда представляет основной или родительский поток, а { 1, 2, 3, ...n } представляет подпотоки. |
status |
nchar(30) | Состояние процесса. Возможны следующие значения: - dormant . SQL Server сбрасывает сеанс.- running . В сеансе выполняются один или несколько пакетов. Если включен режим MARS, в сеансе может выполняться несколько пакетов. Дополнительные сведения см. в разделе Использование множественных активных результирующих наборов (MARS).- background . В сеансе выполняется фоновая задача, например обнаружение взаимоблокировок.- rollback . В сеансе выполняется откат транзакций.- pending . В сеансе ожидается освобождение потока исполнителя.- runnable . Задачи сеанса находятся в очереди исполнителей планировщика, ожидая времени такта.- spinloop . Задачи сеанса ожидают освобождения взаимоблокировки.- suspended . Сеанс ожидает завершения события, например операции ввода-вывода. |
loginame |
nchar(128) | Имя входа, связанное со специфическим процессом. |
hostname |
nchar(128) | Имя узла или компьютера для каждого процесса. |
blk |
char(5) | Идентификатор сеанса для блокирующего процесса, если такой существует. В противном случае этот столбец имеет значение 0 .Если транзакция, связанная с указанным идентификатором сеанса, блокируется потерянным распределенной транзакцией, этот столбец возвращает -2 значение для блокирующей потерянной транзакции. |
dbname |
nchar(128) | База данных, используемая процессом. |
cmd |
nchar(16) | команда ядро СУБД (инструкция Transact-SQL, внутренний процесс ядро СУБД и т. д.), выполняемая для процесса. В SQL Server 2019 (15.x) и более поздних версиях тип данных — nchar(26). |
request_id |
int | Идентификатор для запросов, запущенных в определенном сеансе. |
При параллельной обработке подпотоки создаются для определенного идентификатора сеанса. Главный поток обозначается как spid = <xxx>
и ecid = 0
. Другие подпотеки имеют то же самое spid = <xxx>
, но с ecid > 0
.
Замечания
Блокирующий процесс, который может иметь монопольную блокировку, является тем, который содержит ресурсы, необходимые другому процессу.
Всем потерянным распределенным транзакциям присваивается значение идентификатора сеанса -2
. Потерянные распределенные транзакции — это распределенные транзакции, которые не связаны с идентификатором сеанса. Дополнительные сведения см. в разделе "Использование помеченных транзакций для последовательного восстановления связанных баз данных".
is_user_process
Запросите столбец для sys.dm_exec_sessions
разделения системных процессов от пользовательских процессов.
Разрешения
Требуется разрешение VIEW SERVER STATE на сервере, чтобы просмотреть все выполняемые сеансы в экземпляре SQL Server. Иначе пользователь сможет увидеть только текущий сеанс.
Примеры
А. Перечисление всех текущих процессов
В следующем примере используется хранимая процедура sp_who
без параметров для возврата сведений обо всех текущих пользователях.
USE master;
GO
EXEC sp_who;
GO
B. Перечисление процесса конкретного пользователя
Следующий пример показывает, как просмотреть сведения об отдельном текущем пользователе по имени входа.
USE master;
GO
EXEC sp_who 'janetl';
GO
C. Отображение всех активных процессов
USE master;
GO
EXEC sp_who 'active';
GO
D. Отображение определенного процесса, определяемого идентификатором сеанса
USE master;
GO
EXEC sp_who '10' --specifies the process_id;
GO