如何查看活动的SQL Server连接?


Answers:


354

您可以使用sp_who存储过程。

提供有关Microsoft SQL Server数据库引擎实例中当前用户,会话和进程的信息。可以对信息进行过滤以仅返回那些非空闲,属于特定用户或属于特定会话的进程。


9
当您必须从sys.sysprocesses中筛选特定的数据库时,效果更好
Iman

如何仅为特定数据库添加过滤器?哪里dbname ='数据库名称'?? 我尝试了这个,但遇到一个错误
NULL.Dude

1
@ Geo.Dude,Iman Abidi的意思是从sys.sysprocesses编写您自己的选择查询,并向该查询添加where子句。您必须对dbid进行过滤。您可以在sys.databases中找到数据库ID(或者可以将两者结合在一起)。
bvgheluwe

342
SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections,
    loginame as LoginName
FROM
    sys.sysprocesses
WHERE 
    dbid > 0
GROUP BY 
    dbid, loginame
;

另请参阅Microsoft文档sys.sysprocesses


5
在使事物自动化时,此查询可能比sp_who更有用,而sp_who更面向显示。
科林

这是我的首选方法,但是并不能完全回答OP的问题。建议hostnameSELECTGROUP BY子句中添加以查看连接了哪些客户端。我也刚刚意识到了Msft的错字loginame-那是从列名被限制为8个字符起的产物吗?大声笑
没什么必要,2014年

13
较新版本的SQL Server中不推荐使用sys.sysprocesses。它映射到以下三个管理视图:sys.dm_exec_connections,sys.dm_exec_sessions和sys.dm_exec_requests。
Mike Sherrill'Cat Recall'16

我喜欢ORDER BY 1, 2 DESC, 3
slartidan


44

点击工具栏中的“活动监视器”图标...

从Thorsten的评论中:

在SQL Server Management Studio中,右键单击“服务器”,从上下文菜单中选择“活动监视器”,或者使用键盘快捷键Ctrl+ Alt+ A


12
在SQL Server Management Studio中,右键单击“服务器”,从上下文菜单中选择“活动监视器”-或-使用键盘快捷键Ctrl + Alt + A
ThorstenHüglin2015年

不错的选择,但与从sys.sysprocesses中提取DB_NAME(dbid)相比,它需要更多特权。
Der Zinger

25

下面是我的脚本,用于查找连接到数据库的所有会话,您可以检查这些会话是否正在执行任何I / O,并且可以选择杀死它们。

该脚本还显示每个会话的状态。

看看下面。

--==============================================================================
-- See who is connected to the database.
-- Analyse what each spid is doing, reads and writes.
-- If safe you can copy and paste the killcommand - last column.
-- Marcelo Miorelli
-- 18-july-2017 - London (UK)
-- Tested on SQL Server 2016.
--==============================================================================
USE master
go
SELECT
     sdes.session_id
    ,sdes.login_time
    ,sdes.last_request_start_time
    ,sdes.last_request_end_time
    ,sdes.is_user_process
    ,sdes.host_name
    ,sdes.program_name
    ,sdes.login_name
    ,sdes.status

    ,sdec.num_reads
    ,sdec.num_writes
    ,sdec.last_read
    ,sdec.last_write
    ,sdes.reads
    ,sdes.logical_reads
    ,sdes.writes

    ,sdest.DatabaseName
    ,sdest.ObjName
    ,sdes.client_interface_name
    ,sdes.nt_domain
    ,sdes.nt_user_name
    ,sdec.client_net_address
    ,sdec.local_net_address
    ,sdest.Query
    ,KillCommand  = 'Kill '+ CAST(sdes.session_id  AS VARCHAR)
FROM sys.dm_exec_sessions AS sdes

INNER JOIN sys.dm_exec_connections AS sdec
        ON sdec.session_id = sdes.session_id

CROSS APPLY (

    SELECT DB_NAME(dbid) AS DatabaseName
        ,OBJECT_NAME(objectid) AS ObjName
        ,COALESCE((
            SELECT TEXT AS [processing-instruction(definition)]
            FROM sys.dm_exec_sql_text(sdec.most_recent_sql_handle)
            FOR XML PATH('')
                ,TYPE
            ), '') AS Query

    FROM sys.dm_exec_sql_text(sdec.most_recent_sql_handle)

) sdest
WHERE sdes.session_id <> @@SPID
  AND sdest.DatabaseName ='yourdatabasename'
--ORDER BY sdes.last_request_start_time DESC

--==============================================================================

13

我将其汇总在一起,以便您可以对结果进行一些查询

Declare @dbName varchar(150)
set @dbName = '[YOURDATABASENAME]'

--Total machine connections
--SELECT  COUNT(dbid) as TotalConnections FROM sys.sysprocesses WHERE dbid > 0

--Available connections
DECLARE @SPWHO1 TABLE (DBName VARCHAR(1000) NULL, NoOfAvailableConnections VARCHAR(1000) NULL, LoginName VARCHAR(1000) NULL)
INSERT INTO @SPWHO1 
    SELECT db_name(dbid), count(dbid), loginame FROM sys.sysprocesses WHERE dbid > 0 GROUP BY dbid, loginame
SELECT * FROM @SPWHO1 WHERE DBName = @dbName

--Running connections
DECLARE @SPWHO2 TABLE (SPID VARCHAR(1000), [Status] VARCHAR(1000) NULL, [Login] VARCHAR(1000) NULL, HostName VARCHAR(1000) NULL, BlkBy VARCHAR(1000) NULL, DBName VARCHAR(1000) NULL, Command VARCHAR(1000) NULL, CPUTime VARCHAR(1000) NULL, DiskIO VARCHAR(1000) NULL, LastBatch VARCHAR(1000) NULL, ProgramName VARCHAR(1000) NULL, SPID2 VARCHAR(1000) NULL, Request VARCHAR(1000) NULL)
INSERT INTO @SPWHO2 
    EXEC sp_who2 'Active'
SELECT * FROM @SPWHO2 WHERE DBName = @dbName

sys.sysprocesses已弃用
Marcello Miorelli,

5

MS的查询解释了该KILL命令的使用,它在提供连接信息时非常有用:

SELECT conn.session_id, host_name, program_name,
    nt_domain, login_name, connect_time, last_request_end_time 
FROM sys.dm_exec_sessions AS sess
JOIN sys.dm_exec_connections AS conn
   ON sess.session_id = conn.session_id;

4

您可以执行以下T-SQL命令:

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.