You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:30:58