编写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
相关产品推荐
相关产品推荐

