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