使用引用文本文件中的实例列表的 Powershell 查询多个 SQL Server 实例

Den*_* M. 5 sql-server powershell

我们不是通过 SQL Server Management Studio 为每个实例发出查询,而是尝试创建一个 powershell 脚本来通过循环引用文本文件来查询多个实例,其中假设有 100 个 SQL Server 实例。遍历每个 SQL Server 实例,发出查询,然后导出到 CSV。

下面是我们目前拥有的powershell脚本:

$ServerInstance = "C:\Users\<NAME>\Documents\InstanceList.txt"

foreach ($i in $ServerInstance)
{

$sql = "SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections,
    RTRIM(loginame) as LoginName,
       RTRIM(Hostname) As HostName, Login_Time,Program_name
FROM
    sys.sysprocesses
WHERE --DB_NAME(dbid) = 'genesys_wfm' and 
    dbid > 5
       --and HostName = 'xxxx'
       and loginame not in ('NT AUTHORITY\SYSTEM','ACE','domain\xxxx')
GROUP BY 
    dbid, loginame,Hostname, Login_Time,Program_name
       order by Login_Time desc;"

Invoke-Sqlcmd -ServerInstance $i -Query $sql -ConnectionTimeout 60 -QueryTimeout 99999
Run Code Online (Sandbox Code Playgroud)

下面是InstanceList.txt:

servername\instance name1
servername2\instance name2
Run Code Online (Sandbox Code Playgroud)

等等。

alr*_*roc 6

执行此操作的最简单方法(阅读:您需要编写的附加代码最少)是Invoke-DbaQuerydbatoolsPowerShell 模块使用。

删除foreach循环 - 此函数将为您处理它。将实例列表传入Invoke-DbaQuery并包含-AppendServerInstance开关,将查询所有实例并将每个实例的名称包含在输出中 - 就像您在 SSMS 中执行多实例查询一样。您将得到一个对象,它是针对每个实例的查询结果的集合。

$InstanceList = get-content "C:\Users\<NAME>\Documents\InstanceList.txt";
Invoke-DbaQuery -ServerInstance $InstanceList -Query $sql -QueryTimeout 99999 -AppendServerInstance
Run Code Online (Sandbox Code Playgroud)

由于您没有提到脚本性能/运行时间是一个问题,我故意没有提到并行运行多个查询然后合并结果。