How to connect and query SQL Server using PowerShell

Introduction

In this article we will query Microsoft SQL Server using PowerShell.

This can be a really powerful tool for sys admins and database administrators. You can query multiple servers at once and then use PowerShell to do work with the results.

There are multiple ways you could do this but one of the easiest is to use Invoke-Sqlcmd, so that’s what we will use for this article.

Problem

Sometimes you need to query multiple servers across multiple domains to gather information about sql server instances, backups and other sql server information. This can be challenging within SSMS and your options with the data are limited, but with PowerShell we can query multiple servers and pipe that data to other commands to create powerful snippets of information.

Solution

Using the Invoke-SqlCmd function, we can use the sqlcmd command line tool that your probably familiar with, but is much simpler than working directly with sqlcmd. We can achieve a connection and a query with 1 line of code, or we can use a foreach loop in PowerShell to work with many servers.

Example 1: Running PowerShell to Retrieve the Last Backup

This example shows how we could very quickly retrieve the last backup time of each database across multiple servers.


$databaseName="master"
$instanceNames=("servera.domain1.com\MSSQLSERVER01","serverb.domain2.com\MSSQLSERVER01","serverc.domain3.com\MSSQLSERVER01"))

$query = "SELECT  
@@SERVERNAME AS 'Server', 
msdb.dbo.backupset.database_name AS 'DB Name',  
MAX(msdb.dbo.backupset.backup_finish_date) AS 'Last Backup'
FROM   msdb.dbo.backupmediafamily  
INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id  
WHERE  msdb..backupset.type = 'D' 
GROUP BY 
msdb.dbo.backupset.database_name"


foreach($instance in $instanceNames)
{ 
    Invoke-SqlCmd –ServerInstance $instance -Database $databaseName –Query $query
}

Obviously, this example could easily be changed to perform any task you like, all you need to do is change the $query variable to your own t-sql query and then change the $instanceNames to your own array of server names.

Example 2: Running PowerShell to Retrieve Sql Server Version

This example shows how we could check the sql versions of multiple instances, this would be useful for making sure all the servers in your sql estate have the latest patches.


$instanceNames=("servera.domain1.com\MSSQLSERVER01","servera.domain2.com\MSSQLSERVER01")
$query = "select @@SERVERNAME, @@VERSION"

foreach($instance in $instanceNames)
{ 
    Invoke-SqlCmd –ServerInstance $instance -Query $query
}

Conclusion

The purpose of this article was to show how to connect to sql server using PowerShell and as you can see its very simple using Invoke-SqlCmd PowerShell function. Working with PowerShell and Microsoft SQL Server together you can do some really awesome things and automate a lot of the day to day sql tasks.