Still very new to Powershell (less than two weeks): I suggest you try this if your query contains multiple columns and rows ... Multidimensional arrays. This was my first attempt at this, and after checking the network, given that I could not find a simple direct solution, I eventually wrote my own solution. Here is a complete set of sample code for experimentation and use.
A complete set of code examples below ....
############################################################################################# # RDSago # RDSago@gmail.com # 09/20/2014 ############################################################################################# # # Capturing database size information from a collection of servers # and returning that back to an array that can be used to populate # a SQL table that can be used for monitoring database growth remotely. # RDSago, RDSago@gmail.com # # Note, SQL data retrieved in this manner, does not have to be parsed # before it is consumed and used elsewhere, just like any array you have defined. # The data only needs to be addressed by its ".identityname" captured in the # array $queryResults (shown below). # ############################################################################################ ############################################################################################# # T-SQL for creating table to hold data returned # # CREATE TABLE [dba].[tbl_dbfilesize]( # [ServerNameInstance] [varchar](20) NULL, # [DatabaseName] [varchar](30) NULL, # [DataFileSizeMB] [numeric](20, 0) NULL, # [LogFileSizeMB] [numeric](20, 0) NULL, # [TotalDatabaseSizeMB] [numeric](20, 0) NULL, # [CollectionDate] [date] NULL # ) ON [PRIMARY] ############################################################################################# Try { #define your connection points # first create an array that will hold the server/instance name of the servers you wish to audit # the first sever assumes a named instance, the second a default instance name. $SourceServerName = @("ServerName01/InstanceName", "ServerName02", "ServerName03") # Server you will retrieve data from #next define the server connection for where you will write your data back to $TargetServerInstance = "TaretServerName" # define your sql query that will be used to pull data from SQL on the Source Server $qryDatabaseInfo = " SELECT @@ServerName as ServerNameInstance, DB.name as DatabaseName, SUM(CASE WHEN type = 0 THEN MF.size * 8 / 1024 ELSE 0 END) AS DataFileSizeMB, SUM(CASE WHEN type = 1 THEN MF.size * 8 / 1024 ELSE 0 END) AS LogFileSizeMB, SUM(CASE WHEN type = 1 THEN MF.size * 8 / 1024 ELSE 0 END) + SUM(CASE WHEN type = 0 THEN MF.size * 8 / 1024 ELSE 0 END) AS TotalDatabaseSizeMB FROM sys.master_files MF JOIN sys.databases DB ON DB.database_id = MF.database_id GROUP BY DB.name ORDER BY DB.NAME ASC " #Loop through all the servers you wish to audit ForEach ($SourceServerName in $SourceServerNames) { #execute query to pull data from server into an array $queryResults = @(Invoke-SQLCmd -query $qryDatabaseInfo -Server $SourceServerInstance) # Next, construct your insert statement from data in your $queryresults array. Foreach ($queryResult in $queryResults) { $query = " Insert Into [DBS_AUDIT_SERVERS].[dba].[tbl_dbfilesize] ([ServerNameInstance], [DatabaseName], [DataFileSizeMB], [LogFileSizeMB], [TotalDatabaseSizeMB], [CollectionDate]) Values (" + "'" + $SourceServerInstance + "'," + "'" + $queryResult.DatabaseName + "'," + "'" + $queryResult.DataFileSizeMB + "'," + "'" + $queryResult.LogFileSizeMB + "'," + "'" + $queryResult.TotalDatabaseSizeMB + "'," + "'" + $Date + "'" + ")" "" #execute insert statement for sql Invoke-Sqlcmd -Query $query -ServerInstance $TargetServerInstance } } } Catch [Exception] { $ErrorMessage = $_.Exception.Message Write-Host $ErrorMessage } Finally { Write-Host "Completed Successfully" } Return 0;
Rdsago
source share