sp_who2的一个问题是,当它两次调用spid时,需要在控制台中运行它,而且大多数报告工具都会将其抛出为错误。
我的问题是,使用下面的代码重新格式化sp_who2比使用sp_who的定义和删除
-向右滚动的用户提供方便的额外服务。
正如我们所描述的那样!
Create Proc [Reports].[UspResults_sp_who2]
As
Begin
Declare @Results 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 @Results
( [SPID]
, [Status]
, [LOGIN]
, [HostName]
, [BlkBy]
, [DBName]
, [Command]
, [CPUTime]
, [DiskIO]
, [LastBatch]
, [ProgramName]
, [SPID_1]
, [REQUESTID]
)
Exec [sys].[sp_who2];
--Only show SPID once, show blocked processes first, followed by CPU time and DISK IO hoggers
Select [SPID]
, [Status]
, [LOGIN]
, [HostName]
, [BlkBy]
, [DBName]
, [Command]
, [CPUTime]
, [DiskIO]
, [LastBatch]
, [ProgramName]
, [REQUESTID]
From @Results
Order By [BlkBy] Asc
, [CPUTime] Desc
, [DiskIO] Desc
, [SPID] Asc;
End;发布于 2016-01-21 19:21:11
如果您在Server 2012+上,还有另一个选项。
您可以使用WITH RESULT SETS和别名有问题的重复列名(如下面的BonusSpid )。
EXEC sys.sp_who2
WITH RESULT SETS
(
(
SPID INT NOT NULL,
Status VARCHAR(1000) NULL,
Login SYSNAME NULL,
HostName SYSNAME NULL,
BlkBy SYSNAME NULL,
DBName SYSNAME NULL,
Command VARCHAR(1000) NULL,
CPUTime INT NULL,
DiskIO INT NULL,
LastBatch VARCHAR(1000) NULL,
ProgramName VARCHAR(1000) NULL,
BonusSpid INT NOT NULL, /*Now unique name*/
RequestId INT NULL
)
);此选项与表变量解决方案具有相同的缺点,即如果sp_who2的定义发生更改并从其中添加或删除列(我认为RequestId是在2005年添加的),则该选项很容易损坏。
这是一个无文档的存储过程,因此它可能在没有警告的情况下随时更改定义或从产品中删除。
另一方面,如果您自己将代码复制并粘贴到一个新模块中,那么如果代码被更改,您将失去自动受益于任何改进/ bug修复的可能性。
但是,您应该考虑使用sp_whoisactive而不是上面的任何一种,因为它的开发要积极得多,并且有大量的其他特性。
https://codereview.stackexchange.com/questions/117499
复制相似问题