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

编写PowerShell脚本实现SQL Server及实例信息自动化记录

没问题,我帮你搞定这个SQL服务器信息采集的PowerShell脚本,完全贴合你的需求来实现:

整体实现思路

咱们的脚本会按这几个核心步骤执行:

  • 先连接到你的CMS/主SQL管理服务器,读取[SQLServerInformation].[dbo].[server_list]里的所有目标服务器清单
  • 遍历每一台目标服务器,尝试连接并查询关键的SQL实例信息(比如版本、实例名称、运行状态、配置参数等)
  • 针对每台服务器,在CMS库中自动创建(如果不存在)命名格式为[$ServerName_server_trunc]的表
  • 把查询到的信息写入对应的目标表,同时处理可能的连接失败、查询错误等异常情况
完整PowerShell脚本实现
# 配置CMS服务器连接信息
$cmsServer = "你的CMS服务器名称"
$cmsDatabase = "SQLServerInformation"
$cmsConnString = "Server=$cmsServer;Database=$cmsDatabase;Integrated Security=True;"

# 1. 读取目标服务器清单
try {
    $serverListQuery = "SELECT ServerName FROM [dbo].[server_list];"
    $serverList = Invoke-SqlCmd -ConnectionString $cmsConnString -Query $serverListQuery -ErrorAction Stop
    Write-Host "成功读取到 $($serverList.Count) 台目标服务器"
}
catch {
    Write-Error "读取服务器清单失败:$_"
    exit 1
}

# 2. 遍历每台服务器采集信息
foreach ($server in $serverList) {
    $targetServer = $server.ServerName.Trim()
    Write-Host "开始处理服务器:$targetServer"

    # 定义目标表名(严格遵循要求的格式)
    $targetTableName = "[$targetServer`_server_trunc]"
    $fullTargetTableName = "[dbo].$targetTableName"

    # 目标服务器连接字符串(默认Windows身份验证,如需SQL验证可修改)
    $targetConnString = "Server=$targetServer;Database=master;Integrated Security=True;Connection Timeout=10;"

    # 3. 查询目标服务器的SQL实例信息(可根据需求自定义字段)
    $infoQuery = @"
SELECT 
    SERVERPROPERTY('MachineName') AS MachineName,
    SERVERPROPERTY('ServerName') AS FullInstanceName,
    SERVERPROPERTY('InstanceName') AS InstanceName,
    SERVERPROPERTY('ProductVersion') AS ProductVersion,
    SERVERPROPERTY('ProductLevel') AS ProductLevel,
    SERVERPROPERTY('Edition') AS Edition,
    @@VERSION AS FullVersionInfo,
    GETDATE() AS CollectionTime
"@

    try {
        # 连接目标服务器并查询信息
        $serverInfo = Invoke-SqlCmd -ConnectionString $targetConnString -Query $infoQuery -ErrorAction Stop

        # 4. 创建目标表(不存在则创建)
        $createTableQuery = @"
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = '$($targetServer)_server_trunc' AND schema_id = SCHEMA_ID('dbo'))
BEGIN
    CREATE TABLE $fullTargetTableName (
        MachineName NVARCHAR(128),
        FullInstanceName NVARCHAR(128),
        InstanceName NVARCHAR(128),
        ProductVersion NVARCHAR(64),
        ProductLevel NVARCHAR(64),
        Edition NVARCHAR(128),
        FullVersionInfo NVARCHAR(MAX),
        CollectionTime DATETIME
    )
END
"@
        Invoke-SqlCmd -ConnectionString $cmsConnString -Query $createTableQuery -ErrorAction Stop

        # 5. 将查询结果写入目标表
        $insertQuery = @"
INSERT INTO $fullTargetTableName (
    MachineName, FullInstanceName, InstanceName, ProductVersion,
    ProductLevel, Edition, FullVersionInfo, CollectionTime
)
VALUES (
    N'$($serverInfo.MachineName)',
    N'$($serverInfo.FullInstanceName)',
    N'$($serverInfo.InstanceName)',
    N'$($serverInfo.ProductVersion)',
    N'$($serverInfo.ProductLevel)',
    N'$($serverInfo.Edition)',
    N'$($serverInfo.FullVersionInfo)',
    '$($serverInfo.CollectionTime)'
)
"@
        Invoke-SqlCmd -ConnectionString $cmsConnString -Query $insertQuery -ErrorAction Stop

        Write-Host "服务器 $targetServer 的信息已成功写入表 $targetTableName`n"
    }
    catch {
        Write-Warning "处理服务器 $targetServer 失败:$_`n"
        continue
    }
}

Write-Host "所有服务器处理完成!"
关键细节说明
  • 身份验证调整:脚本默认用Windows集成身份验证,如果需要SQL账号验证,把连接字符串改成"Server=$server;Database=master;User ID=你的账号;Password=你的密码;Connection Timeout=10;"
  • 字段扩展:你可以修改$infoQuery里的SQL语句,添加更多需要采集的信息,比如CPU核心数、内存大小、数据库列表、磁盘使用率等
  • 表结构修改:如果要新增字段,记得同步修改创建表的CREATE TABLE语句和插入数据的INSERT语句,保证字段对应
  • 错误处理:脚本里加入了基本的try-catch逻辑,遇到连接失败或者查询错误会跳过当前服务器并给出警告,不会中断整个脚本的运行
  • 表名格式:严格按照你要求的[$ServerName_server_trunc]格式生成,通过转义下划线避免SQL语法冲突

内容的提问来源于stack exchange,提问作者user136474

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:31:23