SQL Server: 过滤 sp_who2 的输出

10 浏览
0 Comments

SQL Server: 过滤 sp_who2 的输出

在SQL Server下,是否有一种简单的方法来过滤sp_who2的输出?比如说,我想只显示某个特定数据库的行。

0
0 Comments

问题出现的原因是在SQL Server 2008 R2中运行代码时,会出现"Column name or number of supplied values does not match table definition."的错误。解决方法是在SPID2后面添加一个REQUESTID列。

以下是整理后的

在SQL Server中,如果想要过滤sp_who2存储过程的输出结果,可以通过创建一个临时表来实现。具体的代码如下:

CREATE TABLE #sp_who2 
(
   SPID INT,  
   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,  
   SPID2 INT
) 
GO
INSERT INTO #sp_who2
EXEC sp_who2
GO
SELECT *
FROM #sp_who2
WHERE Login = 'bla'
GO
DROP TABLE #sp_who2
GO

然而,在SQL Server 2008 R2中运行以上代码时,会出现"Column name or number of supplied values does not match table definition."的错误。为了解决这个问题,我们需要在SPID2的后面添加一个REQUESTID列。即在创建临时表的代码中加入以下一行代码:

ALTER TABLE #sp_who2 ADD REQUESTID INT

这样,在新版本的SQL Server中运行代码时,就不会再出现"Column name or number of supplied values does not match table definition."的错误了。

0
0 Comments

问题出现的原因是使用sp_who2存储过程时,无法对输出结果进行过滤。解决方法是直接查询源表master.dbo.sysprocesses,并使用ORDER BY和WHERE子句对结果进行排序和过滤。另外,也可以考虑使用SSMS中的Activity Monitor工具进行监控和管理。

以下是一个可替代sp_who2的查询示例:

SELECT  spid,
        sp.[status],
        loginame [Login],
        hostname, 
        blocked BlkBy,
        sd.name DBName, 
        cmd Command,
        cpu CPUTime,
        physical_io DiskIO,
        last_batch LastBatch,
        [program_name] ProgramName   
FROM master.dbo.sysprocesses sp 
JOIN master.dbo.sysdatabases sd ON sp.dbid = sd.dbid
ORDER BY spid 

这样,可以根据需要添加任何ORDER BY或WHERE子句来获取有意义的输出结果。

另外,还可以考虑使用SSMS中的Activity Monitor工具。在SSMS中按下Ctrl + Alt + A快捷键即可打开Activity Monitor。

需要注意的是,blocked和BlkBy是不同的。blocked表示等待释放锁的受害者,而BlkBy表示造成锁的罪魁祸首。因此,将BlkBy列的别名设置为blocked是错误的。

在Azure SQL Database中,以上两种解决方法都无法使用。但这仍然是一个好的解决方案。

0
0 Comments

问题出现的原因是需要对sp_who2存储过程的输出进行过滤。解决方法是使用INSERT INTO语句将sp_who2的输出存储到一个临时表中,然后根据需求对临时表进行过滤操作。以下是具体的代码示例:

DECLARE @TempTable 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 @TempTable
EXEC sp_who2
SELECT *
FROM @TempTable
WHERE .... --根据具体需求添加过滤条件

另外,还可以参考Bo Flexson在stackoverflow上的回答,他提供了一个扩展方法来解决这个问题。具体方法可以参考他在stackoverflow上的回答

0