在PowerShell中执行sp_who2存储过程遇重复列名错误如何解决?
解决PowerShell中调用sp_who2的重复列名问题
因为sp_who2返回的结果集包含重复列名(比如末尾的SPID列),而Invoke-Sqlcmd不允许重复列名,所以需要通过临时表中转或改用系统视图来解决:
方法1:临时表中转重命名重复列
执行以下PowerShell命令,将sp_who2的结果导入临时表,给重复列指定唯一名称后再查询:
Invoke-Sqlcmd -ServerInstance 'DB001' -Query @" CREATE TABLE #Who2 ( SPID INT, Status VARCHAR(100), Login VARCHAR(100), HostName VARCHAR(100), BlkBy VARCHAR(10), DBName VARCHAR(100), Command VARCHAR(100), CPUTime INT, DiskIO INT, LastBatch VARCHAR(30), ProgramName VARCHAR(100), SPID2 INT, RequestID INT ); INSERT INTO #Who2 EXEC sp_who2 '107'; SELECT SPID, Status, Login, HostName, BlkBy, DBName, Command, CPUTime, DiskIO, LastBatch, ProgramName, SPID2 AS RequestSPID, RequestID FROM #Who2; DROP TABLE #Who2; "@
方法2:用系统视图替代sp_who2
如果不需要sp_who2的全部字段,直接查询系统视图获取相同信息,从根源避免重复列问题:
Invoke-Sqlcmd -ServerInstance 'DB001' -Query @" SELECT s.session_id AS SPID, s.status, s.login_name AS Login, s.host_name AS HostName, CASE WHEN r.blocking_session_id = 0 THEN '0' ELSE CAST(r.blocking_session_id AS VARCHAR) END AS BlkBy, DB_NAME(s.database_id) AS DBName, r.command, s.cpu_time AS CPUTime, s.reads + s.writes AS DiskIO, s.last_request_end_time AS LastBatch, s.program_name AS ProgramName, r.session_id AS RequestSPID, r.request_id AS RequestID FROM sys.dm_exec_sessions s LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_id WHERE s.session_id = 107; "@
补充说明
- 方法1完全复刻
sp_who2的输出结构,仅对重复列重命名,适合需要完整兼容原输出的场景。 - 方法2通过系统视图直接取数,更灵活可控,还能按需调整输出字段。
内容的提问来源于stack exchange,提问作者lit
相关产品推荐
相关产品推荐

