sp_who (Transact-SQL)
提供 Microsoft SQL Server Database Engine 執行個體中有關目前使用者、工作階段和處理序的資訊。 您可以篩選資訊,只傳回屬於特定使用者或屬於特定工作階段的非閒置處理序。
語法
sp_who [ [ @loginame = ] 'login' | session ID | 'ACTIVE' ]
引數
[ @loginame = ] 'login' | session ID | 'ACTIVE'
這可用來篩選結果集。login 是 sysname,用來識別屬於特定登入的處理序。
session ID 是屬於 SQL Server 執行個體的工作階段識別碼。 session ID 是 smallint。
ACTIVE 會排除在等待使用者下一個命令的工作階段。
如果沒有提供任何值,程序會報告屬於執行個體的所有工作階段。
傳回碼值
0 (成功) 或 1 (失敗)
結果集
sp_who 會傳回含下列資訊的結果集。
資料行 |
資料類型 |
說明 |
---|---|---|
spid |
smallint |
工作階段識別碼。 |
ecid |
smallint |
特定工作階段識別碼所關聯之給定執行緒的執行內容識別碼。 ECID = {0, 1, 2, 3, ...n},其中 0 一律代表主要或父執行緒,{1, 2, 3, ...n} 代表子執行緒。 |
status |
nchar(30) |
處理序狀態。 可能的值為: dormant。 SQL Server 正在重設工作階段。 running。 工作階段正在執行一或多個批次。 啟用 Multiple Active Result Set (MARS) 之後,工作階段就可以執行多個批次。 如需詳細資訊,請參閱<使用 Multiple Active Result Sets (MARS)>。 background。 工作階段正在執行背景工作,例如死結偵測。 rollback。 工作階段正在進行交易回復。 pending。 工作階段正在等候工作者執行緒變成可用狀態。 runnable。 在等候取得時間配量時,工作階段的工作位於排程器的可執行佇列中。 spinloop。 工作階段的工作正在等候單一執行緒存取鎖變成可用狀態。 suspended。 工作階段正在等候事件 (例如 I/O) 完成。 |
loginame |
nchar(128) |
特定處理序所關聯的登入名稱。 |
hostname |
nchar(128) |
每個處理序的主機或電腦名稱。 |
blk |
char(5) |
封鎖處理序的工作階段識別碼 (如果有)。 否則,這個資料行就是零。 當被遺棄的分散式交易封鎖了與指定工作階段識別碼相關的交易時,這個資料行會針對進行封鎖的被遺棄交易傳回 '-2'。 |
dbname |
nchar(128) |
處理序所用的資料庫。 |
cmd |
nchar(16) |
針對處理序來執行的 Database Engine 命令 (Transact-SQL 陳述式、內部 Database Engine 處理序等等)。 |
request_id |
int |
在特定工作階段中執行的要求識別碼。 |
發生平行處理時,會針對特定的工作階段識別碼建立子執行緒。 主要執行緒會以 spid = <xxx> 和 ecid =0 的方式指出。 其他的子執行緒具有相同的 spid = <xxx>,但是 ecid > 0。
備註
進行封鎖的處理序 (可能擁有獨佔鎖定) 為持有另一處理序所需要之資源的處理序。
所有被遺棄的分散式交易都會有指派的工作階段識別碼值 '-2'。 被遺棄的分散式交易是不與任何工作階段識別碼相關聯的分散式交易。 如需詳細資訊,請參閱<使用標示的異動以一致的方式復原相關資料庫 (完整復原模式)>。
查詢 sys.dm_exec_sessions 的 is_user_process 資料行,以分隔系統處理序與使用者處理序。
權限
需要有這部伺服器的 VIEW SERVER STATE 權限,才能在 SQL Server 執行個體上看到所有執行中的工作階段。 否則,使用者只會看到目前的工作階段。
範例
A.列出所有目前的處理序
下列範例使用不具參數的 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