web-dev-qa-db-ja.com

テキストファイル内のインスタンスのリストを参照するPowershellを使用して複数のSQL Serverインスタンスをクエリする

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

など。

4
Dennis M.

これを行う最も簡単な方法(読み取り:記述する必要がある追加のコードの最小量)は、 Invoke-DbaQuerydbatools 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

スクリプトのパフォーマンスや経過時間の問題については触れていないので、意図的に複数のクエリを並行して実行してから結果をマージすることについては触れませんでした。

5
alroc

ここでこのスクリプトを使用して、必要なことを実行できます。 https://sql-box.com/2012/10/03/how-to-run-a-sql-query-on-list -of-servers-and-save-output-to-Excel-spreadsheet-using-power-Shell /

1
Select 'DBA'