在SQL Server下,是否有一种简单的方法来过滤sp_who2的输出?例如,假设我只想显示某个数据库的行。
当前回答
你可以试试
DECLARE @Table TABLE(
SPID INT,
Status VARCHAR(MAX),
LOGIN VARCHAR(MAX),
HostName VARCHAR(MAX),
BlkBy VARCHAR(MAX),
DBName VARCHAR(MAX),
Command VARCHAR(MAX),
CPUTime INT,
DiskIO INT,
LastBatch VARCHAR(MAX),
ProgramName VARCHAR(MAX),
SPID_1 INT,
REQUESTID INT
)
INSERT INTO @Table EXEC sp_who2
SELECT *
FROM @Table
WHERE ....
过滤你需要的东西。
其他回答
你可以试试
DECLARE @Table TABLE(
SPID INT,
Status VARCHAR(MAX),
LOGIN VARCHAR(MAX),
HostName VARCHAR(MAX),
BlkBy VARCHAR(MAX),
DBName VARCHAR(MAX),
Command VARCHAR(MAX),
CPUTime INT,
DiskIO INT,
LastBatch VARCHAR(MAX),
ProgramName VARCHAR(MAX),
SPID_1 INT,
REQUESTID INT
)
INSERT INTO @Table EXEC sp_who2
SELECT *
FROM @Table
WHERE ....
过滤你需要的东西。
这是你的解决方案: http://blogs.technet.com/b/wardpond/archive/2005/08/01/the-openrowset-trick-accessing-stored-procedure-output-in-a-select-statement.aspx
select * from openrowset ('SQLOLEDB', '192.168.x.x\DATA'; 'user'; 'password', 'sp_who')
类似于KyleMit的答案,可以直接选择SP_WHO2使用的表,尽管我认为它只需要dbo。sysprocesses表。
如果有人打开这个SP,它可以理解它是做什么的。这是我的最佳选择,以获得与SP_WHO2类似的输出
select convert(char(5),sp.spid) as SPID
, CASE lower(sp.status)
When 'sleeping' Then lower(sp.status)
Else upper(sp.status)
END as Status
, convert(sysname, rtrim(sp.loginame)) as LOGIN
, CASE sp.hostname
When Null Then ' .'
When ' ' Then ' .'
Else rtrim(sp.hostname)
END as HostName
, CASE isnull(convert(char(5),sp.blocked),'0')
When '0' Then ' .'
Else isnull(convert(char(5),sp.blocked),'0')
END as BlkBy
, case when sp.dbid = 0 then null when sp.dbid <> 0 then db_name(sp.dbid) end as DBName
, sp.cmd as Command
, sp.cpu as CPUTime
, sp.physical_io as DiskIO
, sp.last_batch as LastBatch
, sp.program_name as ProgramName
from master.dbo.sysprocesses sp (nolock)
;
在这个选择中,您可以选择您需要的字段,并有您想要的顺序。
有相当多好的sp_who3用户存储过程——我相信Adam Machanic做了一个非常好的存储过程,AFAIK。
亚当称之为“谁活跃”: http://whoisactive.com
基于http://web.archive.org/web/20080218124946/http://sqlserver2005.databases.aspfaq.com/how-do-i-mimic-sp-who2.html 我已经创建了以下脚本,它解决了使用DMV在sql 2005, 2008和2008R2下查找到任何数据库的活动连接
以下脚本使用sys. sys。Dm_exec_sessions, sys。Dm_exec_requests, sys。Dm_exec_connections, sys.dm_tran_locks
Declare @dbName varchar(1000)
set @dbName='abc'
;WITH DBConn(SPID,[Status],[Login],HostName,DBName,Command,LastBatch,ProgramName)
As
(
SELECT
SPID = s.session_id,
Status = UPPER(COALESCE
(
r.status,
ot.task_state,
s.status,
'')),
[Login] = s.login_name,
HostName = COALESCE
(
s.[host_name],
' .'
),
DBName = COALESCE
(
DB_NAME(COALESCE
(
r.database_id,
t.database_id
)),
''
),
Command = COALESCE
(
r.Command,
r.wait_type,
wt.wait_type,
r.last_wait_type,
''
),
LastBatch = COALESCE
(
r.start_time,
s.last_request_start_time
),
ProgramName = COALESCE
(
s.program_name,
''
)
FROM
sys.dm_exec_sessions s
LEFT OUTER JOIN
sys.dm_exec_requests r
ON
s.session_id = r.session_id
LEFT OUTER JOIN
sys.dm_exec_connections c
ON
s.session_id = c.session_id
LEFT OUTER JOIN
(
SELECT
request_session_id,
database_id = MAX(resource_database_id)
FROM
sys.dm_tran_locks
GROUP BY
request_session_id
) t
ON
s.session_id = t.request_session_id
LEFT OUTER JOIN
sys.dm_os_waiting_tasks wt
ON
s.session_id = wt.session_id
LEFT OUTER JOIN
sys.dm_os_tasks ot
ON
s.session_id = ot.session_id
LEFT OUTER JOIN
(
SELECT
ot.session_id,
CPU_Time = MAX(usermode_time)
FROM
sys.dm_os_tasks ot
INNER JOIN
sys.dm_os_workers ow
ON
ot.worker_address = ow.worker_address
INNER JOIN
sys.dm_os_threads oth
ON
ow.thread_address = oth.thread_address
GROUP BY
ot.session_id
) tt
ON
s.session_id = tt.session_id
WHERE
COALESCE
(
r.command,
r.wait_type,
wt.wait_type,
r.last_wait_type,
'a'
) >= COALESCE
(
'',
'a'
)
)
Select * from DBConn
where DBName like '%'+@dbName+'%'
推荐文章
- 在SQL Server 2008 R2中重命名数据库时出错
- 将数据复制到另一个表中
- 如何在SQL中选择表的最后一条记录?
- 修改列,添加默认约束
- 在存储过程中使用“SET XACT_ABORT ON”有什么好处?
- 如何检查SQL Server文本列是否为空?
- 如何创建一个SQL Server函数“连接”多行从一个子查询到一个单独的分隔字段?
- 在SQL中更新多个列
- 如何删除表中特定列的第一个字符?
- 等价的限制和偏移SQL Server?
- 如何从SQL Server中的字符串中剥离所有非字母字符?
- 为什么我不能在DELETE语句中使用别名?
- 多语句表值函数vs内联表值函数
- NOLOCK提示在SELECT语句中的作用
- SQL OVER()子句-它什么时候有用,为什么有用?