Condividi tramite


sp_who (Transact-SQL)

Si applica a: SQL Server

Fornisce informazioni sugli utenti, le sessioni e i processi correnti in un'istanza del motore di database di SQL Server. Le informazioni possono essere filtrate per restituire solo i processi che non sono inattive, che appartengono a un utente specifico o che appartengono a una sessione specifica.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

sp_who [ [ @loginame = ] { 'login' | *session_id* | 'ACTIVE' } ]
[ ; ]

Argomenti

[ @loginame = ] { 'login' | session_id | 'ACTIVE' }

Utilizzato per filtrare il set di risultati.

  • login è sysname che identifica i processi appartenenti a un account di accesso specifico.

  • session_id è un numero di identificazione di sessione appartenente all'istanza di SQL Server. session_id è smallint.

  • ACTIVE esclude le sessioni in attesa del comando successivo dall'utente.

Se non si specifica alcun valore, vengono restituite tutte le sessioni appartenenti all'istanza.

Valori del codice restituito

0 (esito positivo) o 1 (errore).

Set di risultati

sp_who restituisce un set di risultati con le informazioni seguenti.

Colonna Tipo di dati Descrizione
spid smallint ID sessione.
ecid smallint ID del contesto di esecuzione di un determinato thread associato a un ID di sessione specifico.

ECID = { 0, 1, 2, 3, ...n }, dove 0 rappresenta sempre il thread principale o padre e { 1, 2, 3, ...n } rappresenta i sottothread.
status nchar(30) Stato del processo. I valori possibili sono:

- dormant. SQL Server reimposta la sessione.

- running. Nella sessione vengono eseguiti uno o più batch. Se si abilita la funzionalità MARS (Multiple Active Result Sets), una sessione può eseguire più batch. Per altre informazioni, vedere Uso di MARS (Multiple Active Result Set).

- background. Nella sessione viene eseguita un'attività in background, ad esempio il rilevamento dei deadlock.

- rollback. Nella sessione è in corso il rollback di una transazione.

- pending. La sessione è in attesa che un thread di lavoro diventi disponibile.

- runnable. L'attività della sessione si trova nella coda eseguibile di un'utilità di pianificazione in attesa di un quantum temporale.

- spinloop. L'attività della sessione è in attesa che venga liberato uno spinlock.

- suspended. La sessione è in attesa del completamento di un evento, ad esempio di I/O.
loginame nchar(128) Nome dell'account di accesso associato a un particolare processo.
hostname nchar(128) Nome host o di computer per ogni processo.
blk char(5) ID di sessione del processo di blocco, se esistente. In caso contrario, questa colonna è 0.

Quando una transazione associata a un ID di sessione specificato è bloccata da una transazione distribuita orfana, questa colonna restituisce un oggetto -2 per la transazione orfana di blocco.
dbname nchar(128) Database utilizzato dal processo.
cmd nchar(16) motore di database comando (istruzione Transact-SQL, processo interno motore di database e così via) in esecuzione per il processo. In SQL Server 2019 (15.x) e versioni successive il tipo di dati è nchar(26).
request_id int ID per le richieste in esecuzione in una sessione specifica.

Con l'elaborazione parallela, i sottothread vengono creati per l'ID sessione specifico. Il thread principale è indicato da spid = <xxx> e ecid = 0. Gli altri sottothread hanno lo stesso spid = <xxx>, ma con ecid > 0.

Osservazioni:

Un processo di blocco, che potrebbe avere un blocco esclusivo, è uno che contiene risorse necessarie per un altro processo.

A tutte le transazioni distribuite orfane viene assegnato il valore id sessione di -2. Le transazioni distribuite orfane sono transazioni distribuite che non sono associate ad alcun ID sessione. Per altre informazioni, vedere Usare transazioni contrassegnate per ripristinare in modo coerente i database correlati.

Eseguire una query sulla is_user_process colonna di per separare i processi di sys.dm_exec_sessions sistema dai processi utente.

Autorizzazioni

È richiesta l'autorizzazione VIEW SERVER STATE sul server per visualizzare tutte le sessioni in esecuzione nell'istanza di SQL Server. In caso contrario, sarà possibile visualizzare solo la sessione corrente.

Esempi

R. Elencare tutti i processi correnti

Nell'esempio seguente la stored procedure sp_who viene eseguita senza parametri in modo che vengano restituiti tutti gli utenti correnti.

USE master;
GO
EXEC sp_who;
GO

B. Elencare il processo di un utente specifico

Nell'esempio seguente viene illustrato come visualizzare le informazioni su un singolo utente corrente in base al nome dell'account di accesso.

USE master;
GO
EXEC sp_who 'janetl';
GO

C. Visualizzare tutti i processi attivi

USE master;
GO
EXEC sp_who 'active';
GO

D. Visualizzare un processo specifico identificato da un ID sessione

USE master;
GO
EXEC sp_who '10' --specifies the process_id;
GO