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

Geo*_*ge2 272 sql sql-server sql-server-2008

我正在使用SQL Server 2008 Enterprise.我想看到任何活动的SQL Server连接,以及所有连接的相关信息,例如从哪个IP地址连接到哪个数据库或其他东西.

是否存在解决此问题的命令?

Meh*_*ari 333

您可以使用sp_who存储过程.

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

  • 当您必须过滤特定数据库时,从sys.sysprocesses中选择更好 (8认同)
  • 我将如何仅为特定数据库添加过滤器?WHERE dbname = '数据库名称' ?? 我试过这个,但出现错误 (2认同)
  • @Geo.Dude,Iman Abidi 意味着从 sys.sysprocesses 制作您自己的选择查询,并向该查询添加 where 子句。您必须对 dbid 进行过滤。您可以在 sys.databases 中找到数据库 ID(或者您可以加入这两个)。 (2认同)

Sye*_*med 316

SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections,
    loginame as LoginName
FROM
    sys.sysprocesses
WHERE 
    dbid > 0
GROUP BY 
    dbid, loginame
;
Run Code Online (Sandbox Code Playgroud)

另请参阅sys.sysprocesses的Microsoft文档.

  • [sys.sysprocesses已弃用](https://msdn.microsoft.com/en-us/library/ms179881.aspx)在更新版本的SQL Server中.它映射到这些[三个管理视图](https://msdn.microsoft.com/en-us/library/ms187997.aspx):sys.dm_exec_connections,sys.dm_exec_sessions和sys.dm_exec_requests. (12认同)
  • 在自动化事物时,此查询可能比sp_who更有用,后者更倾向于显示. (5认同)

Skl*_*vvz 52

除此之外sp_who,您还可以使用"未记录的" sp_who2系统存储过程,它为您提供更详细的信息.请参阅sp_who和sp_who2之间的差异.

  • 谁连接到dbo.First? (13认同)

小智 41

单击工具栏中的"活动监视器"图标...

来自Thorsten的评论:

在SQL Server Management Studio中,右键单击Server,从上下文菜单中选择"Activity Monitor" - 或 - 使用键盘快捷键Ctrl+ Alt+ A.

  • 在SQL Server Management Studio中,右键单击Server,从上下文菜单中选择"Activity Monitor" - 或 - 使用键盘快捷键Ctrl + Alt + A (11认同)

Mar*_*lli 21

下面是我的脚本,用于查找连接到数据库的所有会话,您可以检查这些会话是否正在执行任何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

--==============================================================================
Run Code Online (Sandbox Code Playgroud)


Don*_*ing 12

我把它扔在一起,这样你就可以对结果进行一些查询

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
Run Code Online (Sandbox Code Playgroud)


Zal*_*ain 12

解释KILL命令使用的 MS 查询非常有用,可提供连接信息:

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;
Run Code Online (Sandbox Code Playgroud)


sin*_*anu 5

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

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
Run Code Online (Sandbox Code Playgroud)