SQL Server Management Studioを介してインスタンスごとにクエリを発行するのではなく、たとえば100個のSQL Serverインスタンスがあるテキストファイルを参照するループを通過することにより、複数のインスタンスをクエリするPowerShellスクリプトを作成しようとしています。各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
以下はInstanceList.txtです。
servername\instance name1
servername2\instance name2
など。
これを行う最も簡単な方法(読み取り:記述する必要がある追加のコードの最小量)は、 Invoke-DbaQuery
dbatools
PowerShellモジュールから。
foreach
ループを削除します-この関数はそれを処理します。インスタンスのリストをInvoke-DbaQuery
に渡し、-AppendServerInstance
スイッチを含めます。SSMSでマルチインスタンスクエリを実行する場合と同様に、すべてのインスタンスがクエリされ、それぞれの名前が出力に含まれます。 。各インスタンスに対するクエリの結果のコレクションである1つのオブジェクトが返されます。
$InstanceList = get-content "C:\Users\<NAME>\Documents\InstanceList.txt";
Invoke-DbaQuery -ServerInstance $InstanceList -Query $sql -QueryTimeout 99999 -AppendServerInstance
スクリプトのパフォーマンスや経過時間の問題については触れていないので、意図的に複数のクエリを並行して実行してから結果をマージすることについては触れませんでした。