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)
等等。
执行此操作的最简单方法(阅读:您需要编写的附加代码最少)是Invoke-DbaQuery从dbatoolsPowerShell 模块使用。
删除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)
由于您没有提到脚本性能/运行时间是一个问题,我故意没有提到并行运行多个查询然后合并结果。
| 归档时间: |
|
| 查看次数: |
2626 次 |
| 最近记录: |